填充零到数组,所以我可以添加不同大小的数组matlab / octave

时间:2014-11-05 15:37:21

标签: arrays matlab octave

我试图将零填充到不同大小的数组中,以便我可以将它们一起添加

以下是我尝试做的一些示例代码。

B = repmat(11111, 5, 1)
A= repmat(11, 3, 1)

pad = zeros(abs(length(B)-length(A)), 1)
A_padded = [A; pad] %pad zeros at end
C=B+A_padded

B =

   11111
   11111
   11111
   11111
   11111

>>>A =

   11
   11
   11

>>>pad =

   0
   0

>>>A_padded =

   11
   11
   11
    0
    0

>>>C =

   11122
   11122
   11122
   11111
   11111

正如你所看到的那样,零被填充到变量A 的末尾,这允许我添加不同大小的数组(A和B)来收集。

我在修改下面的代码时遇到了同样的想法吗?

clear all,clf, clc,tic
phi=(1+sqrt(5))/2;
t_rebuilt=linspace(0,2*pi,8000)
aa_sig_combined_L1=zeros(1,length(t_rebuilt));
a1=1;
kk=0;
phase_L1=0;

for kk=100:-1:0 %work my way backwards 
    phi_inc=phi+kk
    t_rebuilt=linspace(0,2*pi,8000*phi_inc); %
    aa_sig_combined_L1=aa_sig_combined_L1+a1*cos ((phi_inc)*t_rebuilt+(phase_L1)); 

end

我使用octave 3.8.1,它应该与matlab代码兼容

4 个答案:

答案 0 :(得分:3)

由于您使用的是Octave,因此您可以使用postpad来完成该功能。如果你不知道哪个阵列会更长,AB,只需填充两个,并且该功能不会触及最大的阵列:

octave-3.8.2> A = repmat (11, 3, 1);
octave-3.8.2> B = repmat (11111, 5, 1);

octave-3.8.2> A = postpad (A, max (rows (A), rows (B)))
A =

   11
   11
   11
    0
    0

octave-3.8.2> B = postpad (B, max (rows (A), rows (B)))
B =

   11111
   11111
   11111
   11111
   11111

octave-3.8.2> 
octave-3.8.2> A + B
ans =

   11122
   11122
   11122
   11111
   11111

在您的具体示例中,替换以下行:

aa_sig_combined_L1=aa_sig_combined_L1+a1*cos ((phi_inc)*t_rebuilt+(phase_L1));

使用:

rhs = a1*cos ((phi_inc)*t_rebuilt+(phase_L1));
aa_sig_combined_L1 = postpad (aa_sig_combined_L1, columns (rhs)) + rhs;

答案 1 :(得分:2)

查看代码循环部分的编辑是否适合您 -

for kk=100:-1:0 %work my way backwards
    phi_inc=phi+kk;
    t_rebuilt=linspace(0,2*pi,8000*phi_inc); %

    %// Get pad length
    padlen = numel(t_rebuilt)-numel(aa_sig_combined_L1);

    %// Pad either of them depending on the sign on `padlen`. 
    %// Thus, negative `padlen` would not pad, but positive would.
    aa_sig_combined_L1 = [aa_sig_combined_L1 zeros(1,padlen)]; %#ok<AGROW>
    t_rebuilt = [t_rebuilt zeros(1,-padlen)]; %#ok<AGROW>

    aa_sig_combined_L1=aa_sig_combined_L1+a1*cos ((phi_inc)*t_rebuilt+(phase_L1));
end

答案 2 :(得分:2)

这是我的建议:

for kk=100:-1:0 %work my way backwards 
    phi_inc=phi+kk;
    t_rebuilt=linspace(0,2*pi,8000*phi); %
    temp = zeros(1,length(t_rebuilt));
    temp(1:length(aa_sig_combined_L1)) = aa_sig_combined_L1;
    temp = temp + a1*cos ((phi_inc)*t_rebuilt+(phase_L1)); 
    aa_sig_combined_L1 = temp;
end

答案 3 :(得分:1)

Matlab(和Octave)在各自的图像处理库中具有padarray函数(usage is the same for octave)。这些功能也可以用于非图像数据,可能就是你想要的。

添加行

aa_sig_combined_L1=padarray(aa_sig_combined_L1, [0, length(t_rebuilt)-length(aa_sig_combined_L1)], 0, 'post');

在循环中重新计算t_rebuilt之后。这将计算长度的差异,并在数据之后使用那么多的零填充数组。您可以在数据之前将post更改为pre to pad。

作为旁注,t_rebuilt在循环中不会改变,因此您可以将其移出循环。