【问题标题】:Add arrays that do not have the same length添加长度不同的数组
【发布时间】:2016-07-12 15:01:40
【问题描述】:

问题

是否有一种巧妙的方法来添加列长度不同的数组/向量,只需向太短的列添加零?我有包含多个变量的加法/减法。

这样:

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

或:

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

代替:

使用 + 时出错 矩阵尺寸必须一致。

我做了什么

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

如果添加一些变量,这可以正常工作,但是在重复多个变量时这会很烦人,尤其是如果您不知道哪一列最长。因此,是否有更简单快速的方法来添加不同的列长度的问题。

编辑

问题真的是,是否有一种方法可以自动执行此操作,因为它具有多个“仅几个”变量。

【问题讨论】:

  • 通常,您只需创建一个函数说:“MyAdd”并在其中写入所有进程,这样您就不必每次都编写它......
  • @BlackAdder 我正在寻找一种聪明的方法,而不仅仅是手动添加零
  • 为什么不创建一个函数?
  • 一种方法是将它们保存到一个单元格数组中,然后使用 bsxfun 的屏蔽功能创建一个常规的 2D 数组,然后进行求和、减法等任何操作,如下所示:Adding 0's to cell array ...。跨度>

标签: arrays matlab add


【解决方案1】:

您或多或少需要手动操作。例如:

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

【讨论】:

  • 您应该使用两个向量中最大的一个预先分配ss=zeros(1, max(numel(a),numel(b)),否则在您的循环中,您将在每次迭代时调整 s 的大小,这真的应该避免
【解决方案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

【讨论】:

  • 感谢您的回答,但问题是我如何为我要添加的 100 个变量执行此操作,而不仅仅是两个,那么 if 语句会变得有点大
  • @KiW 仅当这些变量是动态命名的(这是一个非常糟糕的主意)我可以想到一种自动化的方法:保存所需的变量,将它们作为结构加载并找到最大长度,将所有其他人填充到该长度。如果它们不是动态命名的,则无论如何您都必须将它们手动添加到结构中
【解决方案3】:
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

把它们粘在一个函数中,你就完成了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多