添加长度不同的数组

时间:2016-07-12 15:01:41

标签: arrays matlab add

问题

是否有一种智能方法可以添加不具有相同列长度的数组/向量,只需将零添加到太短的列中?我有包含多个变量的加法/减法。

这样:

a=[ 1; 2; 3]; b=[1;5]
a+b=[2; 5; 3]

或:

a-b=[0;-3;3]

而不是:

  

使用+时出错   矩阵维度必须一致。

我做了什么

 b(numel(a),1) = 0;

这样可以正常工作,如果添加一些变量,但在重复多个变量时会非常烦人,特别是如果你不知道哪个变量最长。因此,问题是否有更容易的快速方法来添加不同的列长度。

修改

问题的确如此,如果有一种方法可以自动执行此操作,因为只有少数几个"变量

3 个答案:

答案 0 :(得分:5)

您需要或多或少地手动执行此操作。例如:

s = [];
s(1,1:numel(a)) = a;
s(2,1:numel(b)) = b; % assigning a row (or column) automatically pads with zeros
    % if needed. This works irrespective of which is bigger, a or b
s = sum(s,1); % sum along each column

如果你有几个变量,最好把它们放在一个单元格数组中,这样你就可以循环它们了:

c = {[1; 2; 3] [1;5] [10 20 30 40]}; % cell array of all "variables"
s = [];
for k = 1:numel(c);
    s(k,1:numel(c{k})) = c{k}; % this zero-pads preceding cells' contents if needed
end
s = sum(s,1); % sum along each column

上述情况可能很慢,因为s是动态重新分配的。您可以预分配,如下所示:

c = {[1; 2; 3] [1;5] [10 20 30 40]}; % cell array of all "variables"
m = max(cellfun(@numel, c)); % maximum vector size
s = zeros(numel(c), m); % preallocate and initiallize to zeros
for k = 1:numel(c);
    s(k,1:numel(c{k})) = c{k}; % some entries maybe be left as zero
end
s = sum(s,1); % sum along each column

答案 1 :(得分:2)

a=[ 1; 2; 3]; b=[1;5];
if numel(b)~=numel(a)
    if numel(b)<numel(a) % If b is shorter, extend it
        b = [b; zeros(numel(a)-numel(b),1)];
    else % If a is shorter, extend it
        a = [a; zeros(numel(b)-numel(a),1)];
    end
end
a+b

答案 2 :(得分:2)

A=[1, 2, 3]; B=[1,5];
[A,zeros(1,length(B)-length(A))]+[B,zeros(1,length(A)-length(B))]

ans =

 2     7     3

[A,zeros(1,length(B)-length(A))]-[B,zeros(1,length(A)-length(B))]

ans =

 0    -3     3

将它们粘贴在一个功能中,你就完成了