我正在尝试将零填充到不同大小的数组中,这样我就可以将它们加在一起
下面是我尝试做的一些示例代码
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
,它是一个函数。如果你不知道哪个数组会更长,A
或B
,只需同时输入两个,函数就不会碰到最大的一个:
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在循环中不会改变,所以你可以将它移到循环之外。