难以理解数组的动态数组的一种实现

Trouble Understanding one Implementation of a Dynamic Array of Arrays

我看到了这段代码 (source):

// memory allocation
float *temp = new float[(order-1)*(order-1)];
float **minor = new float*[order-1];
for(int i=0;i<order-1;i++)
    minor[i] = temp+(i*(order-1));

而且我真的不明白。这段代码的作者试图完成什么? (是的,我知道他正在尝试编写一个程序来求逆矩阵,但我不明白这段代码是如何工作的。)

我认为这是等价的:

float **minor;
minor = new float*[order-1];
for(int i=0;i<order-1;i++)
    minor[i] = new float[(order-1)*(order-1)];

因为 +(i*(order-1)) 似乎只是为了向前移动本质上是内存单元的宽度。不过,我敢肯定,我对这个假设大错特错了。尽管我的理论是错误的,但我在任何地方都找不到对此的解释,因此非常感谢深入的解释。解释如何使用浮点向量的向量来实现这一点也可能会有所帮助。

第一个代码有效地分配了一个 (order-1) x (order-1) 矩阵。它可以像 minor[i][j] 这样处理。也可以通过temp线性寻址:temp[i * (order-1) + j]。有时用这两种方法来寻址矩阵会很方便。许多 commercial/open 源矩阵库使用线性寻址矩阵。

另一种看待它的方式:temp 被分配为一个大块,然后 minor 为每一行(或列,取决于您的观点)索引到 temp。

第二个密码不一样。它正在分配 (order-1)x(order-1)x(order-1) 个元素。