2016-01-26 5 views
1
for k=1:n 
    for m=1:n_ 
     K_anv(k,m,:)=exp(-(x(k,:)-z(m,:)).^2./(2*l'.^2))-A(k,:).*A_(m,:)./B; 
    end 
end 

K_anv является 3D-матрицей, представляющей собой ядро, где k является количеством данных и m является числом точек оценки. x и z: n x D и n_ x D (lD x 1).Vectorising вложенного цикла

Могу ли я стереть петлю в этом случае?

+3

Что '' A' и B'? – Divakar

+4

Не могли бы вы предоставить несколько примеров ввода, чтобы сделать это возможным? См. [MCVE] (http://stackoverflow.com/help/mcve). –

+0

A - это nXD, а A_ - n_XD-матрицы. B является 1XD-вектором –

ответ

2

Поэтапная векторизация с использованием bsxfun -

%// Vectorize "-(x(k,:)-z(m,:)).^2" & thus "exp(-(x(k,:)-z(m,:)).^2./(2*l'.^2))" 
xz = -bsxfun(@minus,permute(x,[1 3 2]),permute(z,[3 1 2])).^2 %//' 
parte1 = exp(bsxfun(@rdivide,xz,permute(2*l'.^2,[1 3 2]))) %//' 

%// Vectorize "A(k,:).*A_(m,:)" & thus "A(k,:).*A_(m,:)./B" 
AA_ = bsxfun(@times,permute(A,[1 3 2]),permute(A_,[3 1 2])) 
parte2 = bsxfun(@rdivide,AA_,permute(B,[1 3 2])) 

%// Finally subtract parte2 from parte1 to get K_anv equivalent 
K_anv_out = parte1 - parte2; 
+0

гениальный! Спасибо! –

+0

@JaeminSon Если этот ответ сработал для вас, подумайте о том, чтобы принять его, нажав на полый флажок рядом с ним. Узнайте больше о принятии ответов здесь - http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Divakar

Смежные вопросы