在数组中填充零,这样我就可以添加不同大小的数组



我正在尝试将零填充到不同大小的数组中,这样我就可以将它们加在一起

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

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

我使用的是倍频程3.8.1,它应该与matlab代码

兼容

由于您使用的是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;

查看对代码循环部分的编辑是否适用-

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

这是我的建议:

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

Matlab(和Octave)在各自的图像处理库中有一个焊盘阵列函数(倍频程的用法相同)。这些函数也可以用于非图像数据,可能正是您想要的。

添加行

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

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

顺便说一句,t_rebuilded在循环中不会改变,所以你可以将它移到循环之外。

最新更新