我试图将零填充到不同大小的数组中,以便我可以将它们一起添加
以下是我尝试做的一些示例代码。
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代码兼容
答案 0 :(得分:3)
由于您使用的是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;
答案 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在循环中不会改变,因此您可以将其移出循环。