Сравните два вектора неравной длины, чтобы получить логический массив - PullRequest
5 голосов
/ 12 ноября 2011

Мне нужно векторизовать следующий код:

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

Выход r должен быть логическим массивом:

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

Ближайший, который я могу получить:

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

Итерация по более короткому вектору, очевидно, более эффективна, поскольку генерирует меньше для итераций.Правильное решение не должно иметь циклов for.

Возможно ли это в MATLAB / Octave?

Ответы [ 2 ]

8 голосов
/ 12 ноября 2011

Вот простое решение с использованием 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 голосов
/ 12 ноября 2011

bsxfun(@eq, a', b)

...