我列出了一些我发现的情况,但我很好奇其他人遇到了什么问题。
(注意:我只寻找代码接受矩阵作为有效输入的情况。任何在给定非向量矩阵作为参数时引发异常的代码都不算。)
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]
2) 使用逻辑值对行向量进行索引将返回一个行向量
使用逻辑值对其他任何内容进行索引将返回一个列向量
a = 1:3;
b = true(1,3);
size(a(b)) == [1, 3]
a = [a; a];
b = [b; b];
size(a(b)) == [6, 1]
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]
4) max, min, sum等函数会对矩阵M的每一列进行操作,除非M是一个1xn的矩阵,在这种情况下它们将作为一个单独的行向量来对M进行操作。
a = 1:3
size(max(a)) == [1, 1]
a = [a;a]
size(max(a)) == [1, 3]
Max很糟糕,因为它甚至不能将维度作为参数(与sum不同)。
写Octave/Matlab代码时,还应该注意哪些类似的情况?
min(rand(3),[],1)
或max(rand(3),[],2)
。 - Amro