大多数语言的行和列索引约定

1 c matlab fortran matrix row-major-order

按照此链接上的问题,对于二维数组“ x(i,j) ”,是否考虑一般规则(我的意思是对于大多数语言),行索引的第一个索引i和索引j对于列的索引?

我知道 Fortran 是列专业,C 语言是行专业,对于两者来说,经典约定似乎是 i = 行和 j = 列,不是吗?

另外,谁能告诉我Matlab是行专业还是列专业?

Lun*_*din 5

这是一个误解。原始数据在内存中的分配方式与原始数据应该建模的高级表示之间没有关系。

C 不会对 中的索引赋予任何含义[i][j],这只是指定数据如何在内存中分配,而不是如何将其呈现给用户。i可以是行,也可以是列,这是程序员在他们的应用程序中指定的。

然而,C 确实将最右边的维度一起分配在内存中,例如:

int arr[2][3] = { {1,2,3}, {1,2,3} };

+-------+-------+-------+-------+-------+-------+
|       |       |       |       |       |       |
|   1   |   2   |   3   |   1   |   2   |   3   |
|       |       |       |       |       |       |
+-------+-------+-------+-------+-------+-------+
Run Code Online (Sandbox Code Playgroud)

这意味着迭代此矩阵的首选方法是:

for(size_t i=0; i<2; i++)
  for(size_t j=0; j<3; j++)
    arr[i][j] = x;
Run Code Online (Sandbox Code Playgroud)

因为就高速缓存而言,此顺序提供最快的内存访问。但该语言并不强制执行此顺序,我们可以j在外循环中进行迭代,程序将同样正常工作(只是速度较慢)。

我们也无法判断这个矩阵应该是 2x3 还是 3x2。