【问题标题】:How to divide a matrix into quarters without additional use of memory?如何在不额外使用内存的情况下将矩阵分成四等分?
【发布时间】:2014-05-07 07:22:48
【问题描述】:

我正在为矩阵乘法制作 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])?

【问题讨论】:

  • 你不能只处理原始矩阵中的四元而不创建新矩阵吗?
  • 我不知道如何解决没有新的季度,这就是我问的原因
  • @Dmytro 不是为整个子矩阵实际分配空间,而是用 ((r1,c1), (r2,c2)) 表示子矩阵,其中 (ri,ci) 是对角子矩阵的点。这样您就可以在不分配额外空间的情况下遍历原始矩阵。

标签: c# algorithm matrix strassen


【解决方案1】:

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

请参阅here(3.3 数据布局)以获得更全面的解释。通常,在课程中教授 Strassen 算法时,不会提及合适的内存布局,这显然会导致对这种实现思想的永久重新发现。

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2017-06-25
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多