2011-11-11 10 views
5

necesito vectorizar el siguiente código:comparar dos vectores de longitudes desiguales para obtener una matriz lógica

a = [1 2 3 2 3 1]; 
b = [1 2 3]; 

for i = 1:length(a) 
    for j = 1:length(b) 
     r(i, j) = (a(i) == b(j)); 
    end 
end 

La salida R debe ser una matriz lógica:

1  0  0 
0  1  0 
0  0  1 
0  1  0 
0  0  1 
1  0  0 

El más cercano que puedo conseguir es:

for j = 1:length(b) 
    r(:, j) = (a == b(j)); 
end 

Iterar a través del vector más corto es obviamente más eficiente, ya que genera menos para ite raciones. La solución correcta no debería tener ningún bucle for.

¿Esto es posible en MATLAB/Octave?

Respuesta

8

Aquí hay una solución simple usando bsxfun.

bsxfun(@eq,b,a') 

ans = 

    1  0  0 
    0  1  0 
    0  0  1 
    0  1  0 
    0  0  1 
    1  0  0 
3

bsxfun(@eq, a', b)

Cuestiones relacionadas