矢量化matlab / octave FOR循环

时间:2013-12-05 13:11:01

标签: matlab octave vectorization

关于如何对此循环进行矢量化,我有点困惑,请参阅下面的代码:

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 变量逐步访问行

感谢。

1 个答案:

答案 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'元素。