在关于 this link 的问题之后, 对于二维数组“x(i,j)”,第一个索引 i 是否是要考虑的一般规则(我指的是大多数语言)用于行索引和索引 j 用于列索引?
我知道 Fortran 是列专业,C 语言是行专业,对于两者来说,经典约定似乎是 i = 行和 j = 列,不是吗?
此外,谁能告诉我 Matlab 是行专业还是列专业?
最佳答案
这是误会。原始数据在内存中的分配方式与原始数据应该建模的更高级别表示之间没有关系。
C 对[i][j]
中的索引没有任何意义,这只是指定了数据在内存中的分配方式,而不是它如何呈现给用户。 i
可以是行也可以是列,这是程序员在他们的应用程序中指定的。
但是,C确实在内存中分配了最右边的维度,例子:
int arr[2][3] = { {1,2,3}, {1,2,3} };
+-------+-------+-------+-------+-------+-------+
| | | | | | |
| 1 | 2 | 3 | 1 | 2 | 3 |
| | | | | | |
+-------+-------+-------+-------+-------+-------+
这意味着迭代此矩阵的首选方法是:
for(size_t i=0; i<2; i++)
for(size_t j=0; j<3; j++)
arr[i][j] = x;
因为就缓存内存而言,此顺序提供最快的内存访问。但是语言不强制执行此顺序,我们可以在外循环中使用 j
进行迭代,程序将同样正常运行(只是速度较慢)。
我们也无法判断这个矩阵应该是 2x3 还是 3x2。
关于大多数语言的行和列索引约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46110327/