在Matlab中将多维数组中的元素条件减少到一个逻辑变量的最优雅方法是什么?我需要这个用于一个包含大量if条件和断言的大项目。在Matlab文档about logical arrays和find array elements中,没有针对此问题的满意解决方案。
例如,如果矩阵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()这样的函数只会在不使用冒号(:)的情况下将顺序减少一个维度,但是使用冒号则无法索引数组的一部分...
答案 0 :(得分: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));