векторизация цикла FOR в матлабе/октаве

Я немного смущен тем, как векторизовать этот цикл 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 для постепенного доступа к строкам.

Благодаря.


person Rick T    schedule 05.12.2013    source источник


Ответы (1)


Один из вариантов — использовать 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-й элемент матрицы.

person Chris Taylor    schedule 05.12.2013
comment
В октаве с широковещательной рассылкой третья строка может читать aa_sig_rebuilt_L = a(:, 2) .* cos(a(:, 1) .* t + a(:, 4)) - person ederag; 24.07.2016