MATLAB以column-major而闻名。因此,操作同一列中的数组条目比操作同一行中的条目更快。
在这种情况下,为什么这么多内置函数(例如linspace
和logspace
)输出行向量而不是列向量?在我看来,这似乎是一种去优化......
这个设计决定背后的理由是什么?
答案 0 :(得分:8)
是一个好问题。以下是一些想法......
我的第一个想法是,就性能和连续内存而言,如果它是行或列,它们没有区别 - 它们在内存中都是连续的。对于多维(> 1D)数组,正确地索引数组的整个列(例如v(:,2)
)而不是行(例如v(2,:)
)或其他维度是正确的,因为这是正确的。在行(非列)的情况下,它不访问内存中连续的元素。但是,对于1-by-N
的行向量,元素是连续的,因为只有一行,所以它没有区别。
其次,在命令窗口中显示行向量更容易,特别是因为它包装了长数组的行。使用长列向量,您将被迫滚动更短的数组。
更多想法......
或许来自linspace
和logspace
的行向量输出只是为了与colon
(本质上是用于创建线性间隔元素的工具)形成一行的事实一致:
>> 0:2:16
ans =
0 2 4 6 8 10 12 14 16
选择是在时间开始时做出的那样(也许是?)。
此外,循环变量的约定可能很重要。定义多次迭代需要一行:
>> for k=1:5, k, end
k =
1
k =
2
k =
3
k =
4
k =
5
列将是具有非标量循环变量的单次迭代:
>> for k=(1:5)', k, end
k =
1
2
3
4
5
也许linspace
和logspace
的输出通常是循环的。也许? :)
但是,为什么还要循环一个行向量呢?好吧,正如我在评论中所说,并不是行向量用于循环,而是循环遍历循环表达式的列。含义for v=M
其中M
是2乘3矩阵,有3次迭代,其中v
是每次迭代中的2个元素列向量 。如果你认为这涉及将循环表达式切换成列(即连续内存块),这实际上是一个很好的设计。