在此链接上的问题之后,这是一般规则(我是指大多数语言),要考虑一个2维数组" x(i,j)",第一个索引 i 对于行的索引和索引 j for列的索引?
我知道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。
对于MATLAB,第一个索引是行,第二个索引是列。但是阵列内部存储在列级订单中(MATLAB的非常早的版本是在Fortran中实现的;当它最初被商业化时,它主要被转换为C,但保留了该约定)。
您的问题在这里回答。
Quote:
总结:
"形状"在C和Fortran中的内存完全相同,即使语言差异由于反向数组索引而看起来不同。
如果您不通过k,j,我订购的fortran阵列迭代,则您会访问内存并对您的高速缓存性能产生负面影响。