对于矩阵运算,为什么"ikj"比"ijk"快?

mpy*_*pyw 5 java algorithm matrix

对于矩阵运算......

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;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

我知道ikjijk快,但不知道为什么.有任何简单的解释吗?谢谢.

Daw*_*ica 15

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

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

等同于

    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];
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是在第一个片段中不能进行这样的优化.因此,第二个代码段需要更少的数组查找.