行主要和列主要顺序确实是编程语言的属性

时间:2014-06-18 15:16:07

标签: 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');
    }

为什么按行打印?因为&#39; \ n&#39;移动到下一行而不是下一列。如果&#39; \ n&#39;被解释为&#34;转到下一列和第一行&#34;和&#39; \ t&#39;转到下一行,然后按列打印A.但我知道我的终端是面向行的,所以如果我想按列打印,唯一的方法是交换这些循环。

如果A [k] 逻辑表示行或列取决于在A上运行的函数,那么需要权衡选择的顺序。例如高斯消除步行rows{column,rows{column}}。首先放置行索引的优点是它可以更容易在旋转时交换行。但是,要执行旋转,必须循环遍历同一列中的所有行,通过选择相反的列应该更快。最里面的消除循环当时可以访问两行,但两者都不是很好。

更好的术语可能是第一索引索引最后索引索引。这是一个纯语言特性:第一索引索引是指第一个给定索引应该增加最慢的情况,而最后索引索引是相反的。 &#34;行&#34;和&#34;列&#34;是一个解释问题很像字节顺序和字符编码:编译器永远不会知道行或列是什么,但它可能有一个语言定义的输入顺序(大多数语言恰好接受大端序的数字常量,但我的计算机需要小端)。这些术语来自环境和库例程中的约定。

1 个答案:

答案 0 :(得分:2)

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