如何在不额外使用内存的情况下将矩阵划分为四分之一?

时间:2014-05-07 07:22:48

标签: c# algorithm matrix strassen

我正在制作用于矩阵乘法的Strassen算法。该算法的基础是将矩阵A(N * N)划分为四分之一A1-A4(N / 2 * N / 2)。为此,我使用循环并为矩阵的每个四分之一分配内存。

    int r;
    double[,] A = new double[r, r]; 
    double[,] A1 = new double[r / 2, r / 2];
    double[,] A2 = new double[r / 2, r / 2];
    double[,] A3 = new double[r / 2, r / 2];
    double[,] A4 = new double[r / 2, r / 2];
    for (int i = 0; i < r / 2; i++)
    for (int j = 0; j < r / 2; j++)
    {
    A1[i, j] = A[i, j];
    }
    for (int i = 0; i < r / 2; i++)
    for (int j = r / 2; j < r; j++)
    {
    A2[i, j - r / 2] = A[i, j];
    }
    for (int i = r / 2; i < r; i++)
    for (int j = 0; j < r / 2; j++)
    {
    A3[i - r / 2, j] = A[i, j];
    }
    for (int i = r / 2; i < r; i++)
    for (int j = r / 2; j < r; j++)
    {
    A4[i - r / 2, j - r / 2] = A[i, j];
    }

有没有更简单的方法可以做到这一点,没有额外的矩阵? (A1 = A [0 ...(n / 2)-1,0 ...(n / 2)-1]例如)?

1 个答案:

答案 0 :(得分:2)

我强烈建议在这里使用所谓的Morton order而不是row-major或column-majopr布局内存布局。数据访问将变得更加容易(为索引计算提供合适的函数)。此外,可以预先分配较小矩阵的空间,以便在每次递归调用中不需要分配和解除分配。请注意,对于每个较小的矩阵大小,只需要使用一组矩阵,因为实际计算使结果仅从较小的矩阵流向较大的矩阵。

有关更全面的说明,请参阅here(3.3数据布局)。通常,当在课程中教授Strassen算法时,没有提到合适的内存布局,这显然会导致永久性地重新发现这种实现思想。