Извлечь одну логическую переменную из нескольких Elementwise-условий в многомерных массивах в Matlab

Каков самый элегантный способ уменьшить поэлементные условия в многомерных массивах до одной логической переменной в Matlab? Мне нужно это для большого проекта с большим количеством условий и утверждений. В документации Matlab о логических массивах и найти элементы массива удовлетворительного решения этой проблемы не существует.

Например, логическая переменная myBool истинна тогда и только тогда, когда в матрицах A и B на одной позиции стоят две единицы:

A = [0,1;0,0]
B = [0,1;1,0]

Мое предпочтительное решение до сих пор:

myBool = any(A(:)==1 & B(:)==1)

Но это не похоже на самое короткое решение и не работает с индексацией массива.

Более короткое, но не очень читаемое решение:

myBool = any(A(B==1))

Самая большая проблема заключается в том, что для многомерных массивов такие функции, как nnz(), уменьшают порядок только на одно измерение без двоеточия (:), но с двоеточием невозможно проиндексировать часть массива...


comment
Из вашего примера может показаться, что предпочитаемое вами решение вполне адекватно. Но вы говорите, что это не так. Можете ли вы уточнить, почему? Что вы имеете в виду, что он не работает с индексацией массива?   -  person Luis Mendo    schedule 23.09.2014
comment
Я думал, что можно как-то обойти оператор двоеточия. Решение @Dylan Richard Muir решает проблему индексации.   -  person JaBe    schedule 23.09.2014


Ответы (1)


Во-первых, если вы используете матрицы класса logical, то вам не нужно проверять на равенство 1.

Помимо индексации, лучшим подходом будет:

bFlag = any(A(:) & B(:));

Если вам нужна индексация, у вас есть два варианта. Вы можете использовать небольшую анонимную функцию векторизации:

fhVec = @(T)(T(:));
bFlag = any(fhVec(A(rowIndices, colIndices) & B(rowIndices, colIndices)));

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

vnLinearIndices = sub2ind(size(A), rowIndices, colIndices);
bFlag = any(A(vnLinearIndices) & B(vnLinearIndices));
person Dylan Richard Muir    schedule 23.09.2014