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

标签 c arrays matlab fortran

在关于 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/

相关文章:

根据伪代码实现计数排序但会产生段错误

javascript - JSON.stringify 使对象数组为空

c# - AutoMapper 自定义类型转换器 ITypeConverter 和映射嵌套对象

arrays - 在 MATLAB 中预分配数组的替代方法是什么?

matlab - 为 Matlab Coder 定义可变大小输入数据

c - 使用 fscanf() 读取一行时遇到问题

c - 字符串格式化时间优化 : pad a line to length K by adding spaces between words

c - 为什么需要转换指针算法?

php - 如何使用私有(private) php 类成员变量作为数组中的键?

javascript - 在对数组执行 "double iteration"的同时对每个项目执行异步操作