MATLAB支持真正的一维数组吗?

3
如果我不必担心意外的二维操作,那么能帮助我更好地理解我的MATLAB代码。例如,如果我想要对一维数组执行逐元素乘法,但一个是行向量,另一个是列向量,我最终得到的是一个二维结果。
>> a = 1:8;
>> a = a(:);
>> a .* cumsum(ones(8))

ans =

     1     1     1     1     1     1     1     1
     4     4     4     4     4     4     4     4
     9     9     9     9     9     9     9     9
    16    16    16    16    16    16    16    16
    25    25    25    25    25    25    25    25
    36    36    36    36    36    36    36    36
    49    49    49    49    49    49    49    49
    64    64    64    64    64    64    64    64

我希望尽可能保持所有数组为一维,以避免这种情况及其他我无法预见的问题。但每次检查向量的 size() 时,至少会返回2个元素:
>> size(1:1:6)

ans =

     1     6

>> size(linspace(0, 5, 10))

ans =

     1    10

我尝试了在如何在matlab中创建单维数组?上的建议以及一些选项 这里(PDF下载),但我不能得到“真正”的一维数组。您如何处理这种类型的问题?


4
cumsum(ones(8)) 不是一列数据。 - Sardar Usama
2个回答

6

1D数组不存在。根据文档所述(强调我的):

所有MATLAB变量都是多维数组,不管数据类型如何。矩阵是一个常用于线性代数的二维数组。

您可以使用isvectorisrowiscolumn来分别识别向量、行向量和列向量。


3

@Sardar已经说了最后一句话。 另一个线索是ndims

N = ndims(A)返回数组A中的维数。 维度的数量始终大于或等于2。...

但关于您提出的其他问题:

您会如何处理这种类型的问题?

您没有太多办法。进行调试,找到错误并修复它。 如果它只是一次性脚本,则完成。 但如果您正在编写可能稍后使用的函数,则最好保护它们免受接受维数不相等的参数的影响:

function myFunc(A, B)
if ndims(A)~=ndims(B) || any(size(A)~=size(B))
    error('Matrix dimensions must agree.');
end
% ...
end

如果你的函数确实需要它们是向量:

function myFunc(A, B)
if ~isvector(A) || ~isvector(B) || any(size(A)~=size(B))
    error('A and B must be vectors with same dimensions.');
end
% ...
end

你还可以使用validateattributes来验证参数的各种属性:

function myFunc(A, B)
validateattributes(A, {'numeric'},{'vector'}, 'myFunc', 'A')
validateattributes(B, {'numeric'},{'size', size(A)}, 'myFunc', 'B')
% ...
end

编辑:

此外,如果函数只需要输入是向量并且它们的方向不重要,您可以在函数内部修改它们(感谢@CrisLuengo的评论)。

function myFunc(A, B)
if ~isvector(A) || ~isvector(B) || length(A)~=length(B)
    error('A and B must be vectors with the same length.');
end
A = A(:);
B = B(:);
% ...
end

然而,当函数的输出也是一个与输入大小相同的向量时,不建议这样做。这是因为调用者期望输出与输入的方向相同,如果不是这种情况,可能会出现问题。

1
感谢您提供 validateattributes 代码片段!这真的非常有用。 - eric_kernfeld
2
@eric:另一个解决方案是强制所有数组成为列向量:a=a(:)。这是一项廉价的操作,不会进行数据复制。 - Cris Luengo
@CrisLuengo 您的评论是这个问题的最佳答案。请将其作为一个答案。特别是因为Matlab是列优先的。 - Robert Seifert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接