MATLAB делает пересечение быстрее

Пусть есть два массива {A,B} размера 1xN

Я хочу найти количество случаев, когда на одних и тех же индексах

условие A(ii)==1 & B(ii)==0 выполнено.

Я старался

casess= intersect( find(A==1),find(B==0 ))

но это очень медленно.

Я полагаю, это потому, что intersect проверяет каждого члена, является ли он членом другой группы, но я все еще ищу самое быстрое решение моей небольшой проблемы.


person JohnnyF    schedule 25.08.2015    source источник
comment
Попробуйте это: casess = sum(A == 1 & B == 0); Нет необходимости использовать find или intercept для простых логических вычислений.   -  person buzjwa    schedule 25.08.2015
comment
Ps ищет что-то более приятное, чем цикл for   -  person JohnnyF    schedule 25.08.2015
comment
Naveh, и если я хочу получить индексы этих случаев?   -  person JohnnyF    schedule 25.08.2015
comment
Тогда вы должны использовать find: indices = find(A == 1 & B == 0);. Кстати, вам могут даже не понадобиться индексы, и вы можете просто использовать логическое индексирование, в зависимости от того, что вы хотите с ними делать. Например, если C также имеет тот же размер, vals = C(A == 1 & B == 0); даст вам значения C для индексов, которые вы получили бы с указанным выше find.   -  person buzjwa    schedule 25.08.2015


Ответы (1)


Количество случаев, когда это условие выполняется, можно вычислить с помощью:

numCases = sum(A == 1 & B == 0);

Выражение A == 1 & B == 0 дает логический массив, который можно использовать, например, для поиска индексов, где условие истинно:

ind = find(A == 1 & B == 0);

или получить прямой доступ к матрице того же размера с помощью логического индексирования. :

C = zeros(size(A));
C(A == 1 & B == 0) = 5;
person buzjwa    schedule 25.08.2015
comment
отличный ответ!. теперь numCases = sum(A == 1 & B == 0); самая медленная часть, есть ли шанс ускорить? даже в стоимость мекс файла или ж/д? - person JohnnyF; 25.08.2015
comment
При быстрой проверке sum и nnz показывают одинаковые скорости. Однако вот что интересно: если A и B оба неотрицательны, то sum(A + B - 1 == 0) в десять раз быстрее, чем sum(A == 1 & B == 0). Я не знаю, относится ли это к вашим данным. - person buzjwa; 25.08.2015
comment
Небольшая поправка: B должно быть строго положительным, чтобы этот метод был эквивалентен исходному. Дело в том, что арифметические операции могут выполняться быстрее, чем логические операции, и это можно использовать в своих интересах, если можно наложить некоторые ограничения на данные. - person buzjwa; 25.08.2015
comment
Рад, что помог :) - person buzjwa; 25.08.2015