我想我发现了一个普遍存在的误解(教授做错了!)。人们说 C 和 C++ 表示行优先顺序和 Fortran 列优先顺序的矩阵。但我怀疑 C 和 C++ 是否按主要顺序构建,因为没有真正的矩阵类型?如果我输入
int A[2][3] = { {1, 2, 3}
, {4, 5, 6} };
顺序是行优先的,因为我的编辑器是面向行的而不是面向列的。这与语言本身无关,或者有吗?如果编辑器是面向专栏的:
i {
n { {
t 1 4
, ,
A 2 5
[ , ,
2 3 6
] } }
[ ;
3
]
=
现在矩阵 A 有两列和三行。
为了进一步说明,考虑一个矩阵打印循环
for(int k=0; k<M; ++k)
{
for(int l=0; l<N; ++l)
{printf("%.7g\t",A[k][l]);}
putchar('\n');
}
为什么它按行打印?因为'\n'移动到下一行而不是下一列。如果 '\n' 被解释为“转到下一列和第一行”并且 '\t' 转到下一行,那么 A 将按列打印。但是我知道我的终端是面向行的,所以如果我想按列打印,唯一的方法就是交换这些循环。
如果 A[k] 逻辑上 表示一行或一列取决于对 A 进行操作的函数,然后需要权衡选择什么顺序。例如高斯消元法 rows{column,rows{column}}
。将 row-index 放在首位的好处是它可以在旋转时更轻松地交换行。但是,要执行旋转,必须循环遍历同一列中的所有行,选择相反的方法应该会更快。最里面的淘汰循环同时访问了两行,都不是很好。
更好的术语可能是first-index indexing 和last-index indexing。这是一个纯语言特性:first-index索引是指第一个给定的索引应该递增最慢的情况,而last-index索引则相反。 “行”和“列”是一个解释问题,很像字节顺序和字符编码:编译器永远不知道行或列是什么,但它可能有一个语言定义的输入顺序(大多数语言碰巧接受大端数字常量命令,但我的电脑需要小端)。这些术语来自环境和库例程中的约定。
最佳答案
这与文本编辑器的工作方式无关,而与二维数组的元素在内存中的布局方式有关。这反过来又决定了嵌套循环(遍历矩阵的所有元素)是否更有效,是将行循环作为内部循环还是将列循环作为内部循环更有效。
关于matrix - 行优先和列优先顺序真的是编程语言的属性吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24289248/