Octave和Matlab"wat"矩阵/向量不一致

dsp*_*pyz 5 matlab vector matrix octave

我已经注意到Matlab和octave中的各种情况,其中函数同时接受矩阵和向量,但是对于向量和对矩阵没有做同样的事情.

这可能令人沮丧,因为当您输入具有可变数量的行/列的矩阵时,它可以被解释为向量并且当高度/宽度为1时执行您不希望的事情,这使得难以进行调试和奇怪的条件边缘情况.

我会列出一些我发现的,但我很好奇其他人遇到的情况

(注意:我只是在寻找代码接受矩阵作为有效输入的情况.当非向量矩阵作为参数给出时引发异常的任何事情都不计算在内)

1)"diag"可用于表示矩阵的对角线或将矢量转换为对角矩阵

由于前者通常仅用于方形矩阵,因此在matlab中并不是那么令人震惊,但是在Octave中,当Octave以非零元素开头并且其他所有零作为"对角矩阵"时,它会特别痛苦.

t=eye(3);
size(diag(t(:,3))) == [3,3]
size(diag(t(:,2))) == [3,3]
size(diag(t(:,1))) == [1,1]
Run Code Online (Sandbox Code Playgroud)

2)索引到具有逻辑的行向量返回行向量

使用逻辑索引到任何其他内容会返回列向量

a = 1:3;
b = true(1,3);
size(a(b)) == [1, 3]
a = [a; a];
b = [b; b];
size(a(b)) == [6, 1]
Run Code Online (Sandbox Code Playgroud)

3)索引到具有索引向量i的向量v中返回与v相同(行/列)类型的向量.但是如果v或i是矩阵,则返回值具有与i相同的大小.

a = 1:3;
b = a';
size(a(b)) == [1, 3]
b = [b,b];
size(a(b)) == [3, 2]
Run Code Online (Sandbox Code Playgroud)

4)max,min,sum等对矩阵M的列进行单独操作,除非M是1xn,在这种情况下它们作为单行向量在M上运行

a = 1:3
size(max(a)) == [1, 1]
a = [a;a]
size(max(a)) == [1, 3]
Run Code Online (Sandbox Code Playgroud)

max特别糟糕,因为它甚至不能将维度作为参数(与sum不同)

在编写八度/ matlab代码时,我应该注意哪些其他类似的情况?

car*_*aug 2

每种语言都有自己的概念。这种语言的一个重要点是经常将矩阵视为向量数组,每列一个条目。那时事情就会开始变得有意义。如果您不希望出现这种行为,请用作matrix(:)那些将传递单个向量而不是矩阵的函数的参数。例如:

octave> a = magic (5);
octave> max (a)
ans =

   23   24   25   21   22

octave> max (a(:))
ans =  25
Run Code Online (Sandbox Code Playgroud)

1) 至少在 Octave 3.6.4 中情况并非如此。我不是 100% 确定,但可能与这个已修复的错误有关。

2) 如果您使用布尔值进行索引,它将被视为掩码并被视为掩码。如果您使用非布尔值进行索引,则它将被视为值的索引。这对我来说非常有意义。

3)这不是真的。返回的索引始终具有相同的大小,如果它是矩阵或向量,则独立。唯一的例外是,如果索引是向量,则输出将是单行。这个想法是,使用单个向量/矩阵进行索引会返回相同大小的内容:

octave> a = 4:7
a =

   4   5   6   7

octave> a([1 1])
ans =

   4   4

octave> a([1 3])
ans =

   4   6

octave> a([1 3; 3 1])
ans =

   4   6
   6   4
Run Code Online (Sandbox Code Playgroud)

4)max至少在 Octave 中确实将维度作为参数。来自 3.6.4 帮助文本max

对于向量参数,返回最大值。对于矩阵参数,返回每列的最大值,作为行向量,或者在维度 DIM(如果已定义)上返回,在这种情况下,Y 应设置为空矩阵(否则将被忽略)。

其余的内容就像我在简介中所说的那样适用。如果您提供一个矩阵,它会将每一列视为一个数据集。

  • 我认为你不明白我在问什么。我通常抱怨向量不被视为矩阵(而你似乎认为我的问题是矩阵不被视为向量)在情况2中,我只用布尔值索引,从不用数字索引(在任何一种情况下都不是) ),但一个返回行向量,另一个返回列向量。在情况3中,你提到的例外正是我所抱怨的。如果我有一个需要索引的矩阵,但该矩阵的列数可变,那么我必须为该异常编写一个 if 语句,只有 1 (2认同)