Question

I am having a really hard time creating a method to raise a matrix to the power. I tried using this

public static int powerMethod(int matrix, int power) {
    int temp = matrix ; 

    for (int i = power; i == 1; i--)
        temp = temp * matrix ; 



    return temp ;

but the return is WAYYY off. Only the first (1,1) matrix element is on point.

I tried using that method in a main like so

// Multiplying matrices
            for (i = 0; i < row; i++)
            {
                for (j = 0; j < column; j++) 
                {
                    for (l = 0; l < row; l++)
                    {
                        sum += matrix[i][l] * matrix[l][j] ;
                    }
                    matrix[i][j] = sum ;
                    sum = 0 ;
                }
                }

    // Solving Power of matrix
            for (i = 0; i < row; i++) {
                for (j = 0; j < column; j++) 
            matrixFinal[power][i][j] = Tools.powerMethod(matrix[i][j], power) ;
            }

Where "power", "row", and "column" is an int that the user enters.

Any ideas how I can do this??

Thanks!!!

Était-ce utile?

La solution

You have a lot of issues here.

First, your matrix squaring algorithm has a (common) error. You have:

for (i = 0; i < row; i++) {
    for (j = 0; j < column; j++) {
        for (l = 0; l < row; l++) {
            sum += matrix[i][l] * matrix[l][j] ;
        }
        matrix[i][j] = sum ;
        sum = 0 ;
    }
}

However, you need to store the result in a temporary second matrix, because when you do matrix[i][j] = sum, it replaces the value at that position with the output, then later results end up being incorrect. Also I suggest initializing sum to 0 first, since it appears you declare it outside of this loop, and initializing it first protects you against any arbitrary value sum may have before going into the loop. Furthermore, it is not immediately clear what you mean by row and column -- make sure you are iterating over the entire matrix. E.g.:

int temp[][] = new int[matrix.length];

for (i = 0; i < matrix.length; i++) {
    temp[i] = new int[matrix[i].length];
    for (j = 0; j < matrix[i].length; j++) {
        sum = 0 ;
        for (l = 0; l < matrix.length; l++) {
            sum += matrix[i][l] * matrix[l][j] ;
        }
        temp[i][j] = sum ;
    }
}

// the result is now in 'temp', you could do this if you wanted:
matrix = temp;

Note that matrix.length and matrix[i].length are fairly interchangeable above if the matrix is square (which it must be, in order to be multiplied by itself).

Secondly, your multiplication squares a matrix. This means if you repeatedly apply it, you keep squaring the matrix every time, which means you will only be able to compute powers that are themselves powers of two.

Your third issue is your final bit doesn't make much sense:

for (i = 0; i < row; i++) {
    for (j = 0; j < column; j++) 
        matrixFinal[power][i][j] = Tools.powerMethod(matrix[i][j], power) ;
}

It's not immediately clear what you are trying to do here. The final part seems to be trying to raise individual elements to a certain power. But this is not the same as raising a matrix to a power.

What you need to do is define a proper matrix multiplication method that can multiply two arbitrary matrices, e.g.:

int[][] multiplyMatrices (int[][] a, int[][] b) {
    // compute and return a x b, similar to your existing multiplication
    // algorithm, and of course taking into account the comments about
    // the 'temp' output matrix above
}

Then computing a power becomes straightforward:

int[][] powerMatrix (int[][] a, int p) {
    int[][] result = a;
    for (int n = 1; n < p; ++ n)
        result = multiplyMatrices(result, a);
    return result;
}

Autres conseils

Why not just use Math.pow?

    import java.lang.Math;

Then you just have to do

    matrixFinal[power][i][j] = (int) Math.pow(matrix[i][j],power); //might have to cast this to an int
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top