您的数据以行优先顺序显示。在读取您的整数数组并验证内容后(即 dim=4 表示后面有 32 个值,dim=2 表示后面有 8 个值等)我不确定您为什么要分配或循环任何内容。
即您可以使用您的物理测试[] 数据作为矩阵:
int dim = test[0];
int (*mat1)[dim] = (int (*)[dim])(test+1);
int (*mat2)[dim] = (int (*)[dim])(test+1 + dim*dim);
C99 在实现级别支持变量数组声明(即编译器可以支持标准定义的特性,但不是必须的;有关更多信息,请参见 C99 标准的 6.7.6.2)。如果您的工具链不支持它,则必须定义一个预定义的宏,并且可以在编译时进行测试(参见 C99 标准的第 6.10.8.3-1 节)。话虽如此,我在过去十多年中使用过的每一个符合 C99 的编译器都支持它,所以如果你的不支持,请在下面的评论中告诉我们。__STDC_NO_VLA__
如果是这样,请注意在mat1
及mat2
以上声明中使用“dim”)。它是 CI 中为数不多的 C++ 所没有的特性之一。所以和你带来的那个跳舞吧。
最后,假设您的编译器符合 C99 并支持 VLA(__STDC_NO_VLA__
未定义),作为额外的超级特殊奖励,几乎可以保证它是获得两个矩阵的最快算法,因为没有算法。您读取一个数组元素,然后分配两个指针。O(3) 很难被击败。
例子
#include <stdlib.h>
#include <stdio.h>
// main loader.
int main(int argc, char *argv[])
{
int test[] = {2,1,2,3,4,5,6,7,8};
int dim = test[0];
int (*mat1)[dim] = (int (*)[dim])(test+1);
int (*mat2)[dim] = (int (*)[dim])(test+1 + dim*dim);
// proof stuff is where it should be.
int i=0,j=0;
for (i=0;i<dim;i++)
{
for (j=0;j<dim;printf("%d ", mat1[i][j++]));
printf (" ");
for (j=0;j<dim;printf("%d ", mat2[i][j++]));
printf("\n");
}
return EXIT_SUCCESS;
}
输出
1 2 5 6
3 4 7 8
使用 3x3 数据集的类似测试:
int test[] = {3,1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1};
输出
1 2 3 9 8 7
4 5 6 6 5 4
7 8 9 3 2 1
最后,一个 4x4 数据集:
int test[] = {4,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1,8,7,6,5,4,3,2,1};
输出
1 2 3 4 8 7 6 5
5 6 7 8 4 3 2 1
1 2 3 4 8 7 6 5
5 6 7 8 4 3 2 1