关于如何对此循环进行矢量化,我有点困惑,请参阅下面的代码:
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 变量逐步访问行
感谢。
答案 0 :(得分:3)
一种选择是使用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
的每一行,而循环计算每一行,将其添加到总和然后丢弃它。)
当您需要在不同大小的数组之间执行二进制运算时,使用函数bsxfun
,例如TxN
矩阵和Tx1
向量。在这种情况下,它将执行矩阵的每列与向量之间的操作。
在您的情况下,您有一个列向量和一个行向量,该操作将应用于列向量的i
'元素和行向量的j
'元素,获取矩阵的ij
'元素。