Related to finding columns of a matrix satisfying specific conditions

1 view (last 30 days)
Hello all,consider the 8 X 4 matrix whose columns are shown below: (Note: Actually we have a large matrix of dimension 8 X 500, but for simplicity we are considering 8 X 4 matrix).
My query is how to find the columns in which only the 3rd and 5th row are non-zero while all other rows are zero.
Any help in this regard will be highly appreciated.
% Col 1
0.00000000000000 + 0.00000000000000i
1.50731573207606 + 0.0126629716692995i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
1.05524235130179 - 1.06946690410098i
% Col 2
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.570954576337680 - 0.0694208400277470i
0.00000000000000 + 0.00000000000000i
-0.439792062677585 + 0.906860087559601i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
% Col 3
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
-0.803157531649936 - 0.535481484911063i
0.00000000000000 + 0.00000000000000i
-0.669680856264729 + 0.552075228739879i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
% Col 4
-0.208494084667111 - 0.237272112154493i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i
-0.117364925574855 + 0.139800044597261i
0.00000000000000 + 0.00000000000000i

Accepted Answer

Walter Roberson
Walter Roberson on 25 Oct 2023
nz = YourMatrix ~= 0;
pattern = [false; false; true; false; true; false; false; false];
matching_column_mask = all(nz == pattern, 1);
You can use matching_column_mask fairly directly, but if you really need to you can find() on it.
Note that I interpreted "3rd and 5th row are non-zero" to mean that they must be non-zero, rather than that they are permitted to be non-zero.
If the rule were that those rows are permitted to be non-zero then
matching_column_mask = all(YourMatrix([1 2 4 6 7 8],:) == 0,1);
  4 Comments
Walter Roberson
Walter Roberson on 25 Oct 2023
rows_to_match = [3, 5];
nz = YourMatrix ~= 0;
pattern = false(height(YourMatrix),1);
pattern(rows_to_match) = true;
matching_column_mask = all(nz == pattern, 1);
The above should work provided that at the time of execution you know which two rows you want to check.

Sign in to comment.

More Answers (1)

Bruno Luong
Bruno Luong on 25 Oct 2023
Edited: Bruno Luong on 25 Oct 2023
% Generate a test matrix
X = rand(8, 500);
X(:,10) = [0 0 3 0 5 0 0 0];
X(:,20) = [0 0 0 0 5 0 0 0]; % won't be detected since X(3,20) is zeros
mask = true(size(X,1),1);
mask([3,5]) = false;
find(all(xor(mask, logical(X)), 1))
ans = 10

Community Treasure Hunt

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

Start Hunting!