[英]vectorizing a matlab / octave FOR loop
我对如何向量化此for循环感到困惑,请参见下面的代码:
array1=[xfreq_orig,yamp_orig,yamp_inv,phase_orig] %frequency, amplitudes, phases to use
t_rebuilt=linspace(0,2*pi,44100)
aa_sig_rebuilt_L=zeros(1,length(t_rebuilt));
aa_sig_combined_L=zeros(1,length(t_rebuilt));
sig_full_L=zeros(1,length(t_rebuilt));
for kk=1:1:numel(xfreq_orig);
aa_sig_rebuilt_L = array1(kk, 2)*cos ((array1(kk,1))*t_rebuilt+(array1(kk, 4)));
aa_sig_combined_L = aa_sig_combined_L + aa_sig_rebuilt_L;
end
sig_full_L=(aa_sig_combined_L/max(abs(aa_sig_combined_L))*.8);
我想出了这个作为矢量化
例:
array1=[10,.4,.34,2.32;12,.3,.45,.4];
t_rebuilt=linspace(0,2*pi,44100)
aa_sig_rebuilt_L = array1(kk, 2).*cos ((array1(kk,1)).*t_rebuilt+(array1(kk, 4)));
aa_sig_combined_L = sum(aa_sig_rebuilt_L);
我不知道该怎么办是如何获取kk变量以递增方式访问行
谢谢。
一种选择是如下使用bsxfun
a = array1;
t = t_rebuilt;
aa_sig_rebuilt_L = bsxfun(@times, a(:,2) , ...
cos( bsxfun(@plus, bsxfun(@times, a(:,1), t), a(:,4)) ));
aa_sig_combined_L = sum(aa_sig_rebuilt_L);
请记住,这将比版本循环使用更多的内存(它将使用numel(xfreq_orig)
内存,因为它在对aa_sig_rebuilt_L
每一行进行aa_sig_rebuilt_L
之前将其计算出来,而循环将计算每一行并将其添加到总和,然后将其丢弃)。
当您需要在不同大小的数组(例如TxN
矩阵和Tx1
向量)之间执行二进制运算时,可以使用函数bsxfun
。 在这种情况下,它将在矩阵的每一列和向量之间执行运算。
你的情况,你有一个列向量和行向量,操作应用到i
“日的列向量和的元素j
”日行向量的元素,以获得ij
“日矩阵的元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.