为什么,如果MATLAB是列专业,那么有些函数会输出行向量吗?

时间:2014-12-15 19:24:28

标签: arrays matlab vector rows

MATLAB以column-major而闻名。因此,操作同一列中的数组条目比操作同一行中的条目更快。

在这种情况下,为什么这么多内置函数(例如linspacelogspace)输出行向量而不是列向量?在我看来,这似乎是一种去优化......

这个设计决定背后的理由是什么?

1 个答案:

答案 0 :(得分:8)

一个好问题。以下是一些想法......

我的第一个想法是,就性能和连续内存而言,如果它是行或列,它们没有区别 - 它们在内存中都是连续的。对于多维(> 1D)数组,正确地索引数组的整个列(例如v(:,2))而不是行(例如v(2,:))或其他维度是正确的,因为这是正确的。在行(非列)的情况下,它不访问内存中连续的元素。但是,对于1-by-N的行向量,元素是连续的,因为只有一行,所以它没有区别。

其次,在命令窗口中显示行向量更容易,特别是因为它包装了长数组的行。使用长列向量,您将被迫滚动更短的数组。

更多想法......

或许来自linspacelogspace的行向量输出只是为了与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

也许linspacelogspace的输出通常是循环的。也许? :)

但是,为什么还要循环一个行向量呢?好吧,正如我在评论中所说,并不是行向量用于循环,而是循环遍历循环表达式的列。含义for v=M其中M是2乘3矩阵,有3次迭代,其中v是每次迭代中的2个元素列向量 。如果你认为这涉及将循环表达式切换成列(即连续内存块),这实际上是一个很好的设计。