matlab for-loop matrix sum sparse-matrix

Matlab: ¿cómo puedo realizar operaciones de fila sin fuerza bruta para el ciclo?



for-loop matrix (1)

Querías aprender acerca de la vectorización, aquí un código para estudiar comparando diferentes implementaciones de esta distancia en pares.

Primero construimos dos matrices binarias como entrada (donde cada fila es una instancia):

m = 5; n = 4; p = 3; A = double(rand(m,p) > 0.5); B = double(rand(n,p) > 0.5);

1. doble vuelta sobre cada par de instancias

D0 = zeros(m,n); for i=1:m for j=1:n D0(i,j) = sum(A(i,:) ~= B(j,:)) / p; end end

2. PDIST2

D1 = pdist2(A, B, ''hamming'');

3. Single-loop sobre cada instancia contra todas las demás instancias

D2 = zeros(m,n); for i=1:n D2(:,i) = sum(bsxfun(@ne, A, B(i,:)), 2) ./ p; end

4. vectorizado con indexación de grillas, todo contra todos

D3 = zeros(m,n); [x,y] = ndgrid(1:m,1:n); D3(:) = sum(A(x(:),:) ~= B(y(:),:), 2) ./ p;

5. vectorizado en tercera dimensión, todo contra todos

D4 = sum(bsxfun(@ne, A, reshape(B.'',[1 p n])), 2) ./ p; D4 = permute(D4, [1 3 2]);

Finalmente comparamos todos los métodos son iguales

assert(isequal(D0,D1,D2,D3,D4))

Necesito hacer una función que funcione así:

N1 = size(X,1); N2 = size(Xtrain,1); Dist = zeros(N1,N2); for i=1:N1 for j=1:N2 Dist(i,j)=D-sum(X(i,:)==Xtrain(j,:)); end end

(X y Xtrain son matrices lógicas dispersas)

Funciona bien y pasa las pruebas, pero creo que no es una solución muy óptima y bien redactada.

¿Cómo puedo mejorar esa función usando algunas funciones construidas de Matlab? Soy absolutamente nuevo para Matlab, así que no sé si realmente hay una oportunidad para hacerlo mejor de alguna manera.