【问题标题】:Raising a matrix to the power method JAVA将矩阵提升到幂法JAVA
【发布时间】:2014-04-06 22:36:37
【问题描述】:

我很难创建一种方法来提升矩阵的幂。我试过用这个

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

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



    return temp ;

但返回是 WAYYY 关闭。只有第一个 (1,1) 矩阵元素在点上。

我尝试在这样的 main 中使用该方法

// 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) ;
            }

其中“power”、“row”和“column”是用户输入的 int。

有什么办法可以做到这一点吗?

谢谢!!!

【问题讨论】:

  • 您是否试图将矩阵提升到幂,例如对于矩阵 M,“N = M^p”?或者您是否尝试对矩阵中的每个单独元素进行操作,然后独立地将它们提升到幂?
  • 基本上是 MMM,对于 m^3

标签: java math matrix multiplication


【解决方案1】:

这里有很多问题。

首先,您的矩阵平方算法存在(常见)错误。你有:

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 ;
    }
}

但是,您需要将结果存储在一个临时的第二个矩阵中,因为当您执行matrix[i][j] = sum 时,它会用输出替换该位置的值,然后以后的结果最终会不正确。我还建议将sum 初始化为0 first,因为您似乎在此循环之外声明了它,并且首先初始化它可以保护您免受sum 在进入循环之前可能具有的任何任意值。此外,尚不清楚row 和column 的含义是什么——请确保您正在迭代整个矩阵。例如:

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;

请注意,matrix.length 和 matrix[i].length 在上面可以互换,如果矩阵是方形的(它必须是方形,以便与自身相乘)。

其次,你的乘法平方一个矩阵。这意味着如果您反复应用它,您每次都会对矩阵进行平方,这意味着您将只能计算本身是 2 的幂的幂。

您的第三个问题是您的最后一点没有多大意义:

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

目前尚不清楚您要在这里做什么。最后一部分似乎是试图将个别元素提升到一定的力量。但这与将矩阵求幂不同。

您需要做的是定义一个适当的矩阵乘法方法,可以将两个任意矩阵相乘,例如:

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
}

那么计算幂就变得简单了:

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

【讨论】:

  • 如果我正确理解了您的算法,您实际上是在将每个矩阵提升到 n+1 的幂,而不是 n 的幂。仔细查看您的 powerMatrix 方法。
  • @DavidWallace 已更正。
  • 酷。你有我的赞成票。这个答案看起来很辛苦。
  • 哇看起来真不错。我现在要试试这个,抱歉迟到的回复我在学校的其他科目真的很忙(准确地说是物理,哈哈,它是一个杀手!)。 @JasonC​​pan>
【解决方案2】:

为什么不直接使用Math.pow?

    import java.lang.Math;

那么你只需要这样做

    matrixFinal[power][i][j] = (int) Math.pow(matrix[i][j],power); //might have to cast this to an int

【讨论】:

  • 因为这不是将矩阵提升到幂的意思。
  • @David Wallace,他将“矩阵”提升为幂的方法实际上只是将 int 提升为幂。这就是我提供的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2017-10-05
相关资源
最近更新 更多