Why do logical indices implicitly reshape? Is there a workaround?
이전 댓글 표시
I've encountered this several times, and it always bothers me. Say for example I want to sum each row of matrix A, for values less than 0.5:
A = rand(3);
B = zeros( size(A) );
B(A<0.5) = A(A<0.5);
row_sum = sum( B, 2 );
But it feels like I should be able to simplify this, with something like:
row_sum = sum( A(A<0.5), 2 );
but this obviously fails because while A<0.5 preserves shape, A(A<0.5) returns a vector where the A<0.5 matrix is implicitly linearized.
I get why this happens (A>0.5 elements would be undefined in a matrix), but it seems incongruous with how logical indices are presented to the user as shape-preserving operations. After all, A<0.5 returns a logical matrix and you would need to call find(A<0.5) to acess the linear indices used to generate A(A<0.5).
In my humble opinion, it seems like this is exactly what NaN should exist for. If the default behavior of A(A<0.5) was to return NaN for A(A>0.5), then having functions like sum with 'omitnan' enabled by default would produce more intuitive results. Am I missing something?
Getting back to earth, are there any practical ways to simplify the above process?
댓글 수: 4
Stephen23
2021년 8월 3일
"...how logical indices are presented to the user as shape-preserving operations"
Are they?
Joel Lynch
2021년 8월 3일
"I think I'm missing something..."
When selecting a subset of array-elements, then these cannot maintain the same shape as the array that they are selected from. The introductory examples here
explains this as "MATLAB matches the locations of the value 1 in ind to the corresponding elements of A and B, and lists their values in a column vector." So the introductory tutorials do not imply "shape preserving". Nor does this more detailed article:
which states "The output is always in the form of a column vector."
This blog page
explains "The logical indexing expression C(D) extracts all the values of Ccorresponding to nonzero values of D and returns them as a column vector."
Can you please give a reference to the MATLAB documentation where "... logical indices are presented to the user as shape-preserving operations", as you wrote in your question.
Joel Lynch
2021년 8월 3일
편집: Joel Lynch
2021년 8월 3일
채택된 답변
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Matrices and Arrays에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!