我注意到 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]
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 代码时,我还应该注意哪些其他此类情况?