matrix - 行优先和列优先顺序真的是编程语言的属性吗

标签 matrix language-agnostic terminology

我想我发现了一个普遍存在的误解(教授做错了!)。人们说 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 indexinglast-index indexing。这是一个纯语言特性:first-index索引是指第一个给定的索引应该递增最慢的情况,而last-index索引则相反。 “行”和“列”是一个解释问题,很像字节顺序和字符编码:编译器永远不知道行或列是什么,但它可能有一个语言定义的输入顺序(大多数语言碰巧接受大端数字常量命令,但我的电脑需要小端)。这些术语来自环境和库例程中的约定。

最佳答案

这与文本编辑器的工作方式无关,而与二维数组的元素在内存中的布局方式有关。这反过来又决定了嵌套循环(遍历矩阵的所有元素)是否更有效,是将行循环作为内部循环还是将列循环作为内部循环更有效。

关于matrix - 行优先和列优先顺序真的是编程语言的属性吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24289248/

相关文章:

java - 是否有一个 java 方法的名称被认为与任何特定类分开?

java ;无法将字符串矩阵转换为 double 矩阵 : Errorjava. lang.NumberFormatException

c++ - std::array 的 std::array 是否具有连续内存?

c++ - boost库中的矩阵赋值如何与括号一起使用?

math - float 学运算是否被破坏?

user-interface - UI 术语 - 启用与事件

.net - Interop 和 RCW(运行时可调用包装器)有什么区别?

matlab - 在矩阵 MATLAB 中查找数组

java - 5+5+5+5+5 和 5*5 哪个更快?

string - "loop rolling algorithm"的解释