繁体   English   中英

向量化Matlab /八度FOR循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM