3 views (last 30 days)

Show older comments

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?

Jakeb Chouinard
on 3 Aug 2021

Edited: Jakeb Chouinard
on 3 Aug 2021

Assuming that modifying A is not allowed, I think you're close to the most simple way to do what you need.

You could also do something like:

A = rand(3);

B = A;

B(B<0.5) = 0; %or NaN, if that's preferred

sum(B,2)

Or:

A = rand(3);

cmpMatrix = A>=0.5; %CoMParison Matrix

sum(A.*cmpMatrix,2)

Jakeb Chouinard
on 3 Aug 2021

That's the spirit! At least then you're using up less space, though if you'll need to call the comparison matrix again, you may be better off keeping it stored. And just since I know the mods prefer to have questions be closed once answered, could you select my response as an accepted answer?

Cheers!

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!