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.