This question already has answers here:
Which ordering of nested loops for iterating over a 2D array is more efficient [duplicate]

(10个答案)


7年前关闭。




对于矩阵运算...

ijk算法
public static int[][] ijkAlgorithm(int[][] A, int[][] B) {
    int n = A.length;
    int[][] C = new int[n][n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
    return C;
}

ikj算法
public static int[][] ikjAlgorithm(int[][] A, int[][] B) {
    int n = A.length;
    int[][] C = new int[n][n];
    for (int i = 0; i < n; i++) {
        for (int k = 0; k < n; k++) {
            for (int j = 0; j < n; j++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
    return C;
}

我知道 ikj ijk 快,但不知道为什么。有什么简单的解释吗?谢谢你。

最佳答案

在第二个片段中,编译器可以优化

    for (int k = 0; k < n; k++) {
        for (int j = 0; j < n; j++) {
            C[i][j] += A[i][k] * B[k][j];
        }
    }

变成相当于
    for (int k = 0; k < n; k++) {
        int temp = A[i][k];
        for (int j = 0; j < n; j++) {
            C[i][j] += temp * B[k][j];
        }
    }

但是在第一个代码段中无法进行此类优化。因此,第二个片段需要更少的数组查找。

关于java - 对于矩阵运算,为什么 “ikj”比 “ijk”快? [复制],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20467117/

10-09 01:05