Is there a faster way to run my code?
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Gn Gnk
el 23 de Sept. de 2020
Comentada: Gn Gnk
el 29 de Sept. de 2020
Hello ,
i wrote the code bellow . Is there any faster and more efficient way to run this code (not using for-loop for example or something like that):
for count1=1:length(r)
for count2=1:length(C)
distance(count2,:)=abs(r(count1,:)-C(count2,:));
dist(count2)=sum(distance(count2,:),2);
end
[dist_hard index_hard(count1)]=min(dist);
end
The problem here is that when r or C contain many elements the code is slow and i its more than obvious that i dont want that .
Any help would be valuable .
0 comentarios
Respuesta aceptada
Walter Roberson
el 23 de Sept. de 2020
[dist_hard, index_hard] = min( pdist2(r, distance, 'cityblock'), [], 2);
Note: the distance measure you are using is the L1-norm, also known as "city block".
11 comentarios
Walter Roberson
el 27 de Sept. de 2020
Does C consist of only values 0 and 1? If so then the distance from r(count1,:) to C(count2,:) is
nnz(r(count1,:) ~= C(count2,:))
and you could vectorize over all C entries as
sum(r(count1,:) ~= C,2)
providing you are using R2016b or later.
If C does consist entirely of 0 and 1, then you can do your entire calculation as
[dist_hard, index_hard] = max(r*C.',[],2);
Note that in the case of ties in the distance, this code will pick the first of them.
Más respuestas (2)
Bruno Luong
el 23 de Sept. de 2020
Editada: Bruno Luong
el 23 de Sept. de 2020
[index_hard, dist_hard] = knnsearch(C,r,'K',1,'Distance','cityblock')
0 comentarios
Bruno Luong
el 27 de Sept. de 2020
Editada: Bruno Luong
el 27 de Sept. de 2020
For binary arrays
r=rand(50,8)>0.5;
C=rand(60,8)>0.5;
[dmin, index_hard] = min(sum(xor(r,permute(C,[3 2 1])),2),[],3);
index_hard'
0 comentarios
Ver también
Categorías
Más información sobre Statistics and Machine Learning Toolbox en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!