Октава: сравнить два вектора

У меня есть этот вектор:

t = 1: 10 % t = 1 2 3 ..10

A= [3 4 5] % a column vector 

Если я наберу:

(3 == t)

Я получаю результат:

0 0 1 0 0 0 0 0 0 0 % it means: 1 at location equals, and 0 at others

Я хочу сделать это для вектора a, что означает, что он будет принимать каждый элемент вектора A, сравнивать и возвращать другой вектор. Таким образом, в этом случае результатом будет матрица 3×10.

Но эта строка приведет к ошибке: A==t.

Конечно, я могу сделать это с помощью цикла for, но я хочу векторизовать эту операцию.


person hqt    schedule 26.08.2012    source источник


Ответы (2)


то, что вы ищете, это функция ismember

octave> t = 1:10
t =
    1    2    3    4    5    6    7    8    9   10

octave> A = ismember (t, [2 3 4])
A =
   0   1   1   1   0   0   0   0   0   0
person carandraug    schedule 26.08.2012

Используя возможность вещания октавы, которая существует в 3.6.3 (не уверен, когда она была введена), вы можете просто сказать это:

A'==t

Если вы хотите, чтобы она давала тот же результат, что и команда carandraug ismember, вам просто нужно добавить «любой», например:

any(A'==t)

Этот метод намного быстрее, чем подход ismember для меньших векторов.

octave:209> tic; for i=1:10000 B=ismember(t,A); end; toc;
Elapsed time is 1.5 seconds.
octave:211> tic; for i=1:10000 B=any(A'==t); end; toc;
Elapsed time is 0.2 seconds.

Примечание: если ваша версия octave не поддерживает вещание или вы хотите, чтобы она была совместима со старыми версиями, A'==t можно заменить на bsxfun(@eq,A',t).

person Glen O    schedule 16.03.2013
comment
-1: Вещание в октаве — это просто неявный эквивалент из bsxfun. Результат определенно отличается от ismember, поэтому сравнивать их бессмысленно. - person Eitan T; 18.03.2013
comment
Извините, но если бы вы удосужились прочитать это, вы бы увидели, что это any(A'==t) дает тот же результат, что и bsxfun. Можешь попробовать, если хочешь. Что касается bsxfun, то про bsxfun никто, кроме вас, ничего не упоминал, так что я действительно не вижу актуальности того пункта... но даже если актуальность и была, то читабельность кода актуальна, а если октава с трансляцией легче читается , лучше. Кроме того, по какой-то причине я обнаружил, что вещание немного быстрее... повторение 10000 раз по B=bsxfun(@eq,t,A') требует примерно на 10% больше времени, чем 10000-кратное выполнение по B=A'= =т. - person Glen O; 18.03.2013
comment
Можете ли вы привести пример ismember, дающий другой результат? Потому что я не вижу ни одной ситуации, в которой это было бы так. Если это дает другой результат, это член или мое решение дает правильный результат? - person Glen O; 18.03.2013
comment
Прошу прощения, я действительно пропустил any, когда пытался запустить ваш код, поэтому я удалил отрицательный голос. Однако я должен отметить, что ismember заметно быстрее для больших массивов (тысячи элементов). - person Eitan T; 18.03.2013
comment
Замечание относительно больших массивов. Я ограничил свое внимание примерами, подобными приведенному. Я немного отредактировал ответ, чтобы отметить, что это быстрее верно только для меньших массивов A. - person Glen O; 18.03.2013
comment
Это может оказаться полезным в некоторых случаях. +1. Я также хотел бы отметить, что ваше решение эквивалентно any(bsxfun(@eq, A', t)). - person Eitan T; 18.03.2013