Indexing with conditions for certain columns

1 view (last 30 days)
I have a huge matrix where I want to find the indexes that meet each column median only and the rest of the column median should not be included. A manual way to do it is written as below but I need an easier way since my matrix is huge. Thank you so much in advanced.
Matrix_All = rand(1000,3) * 100;
Median_All = median(Matrix_All);
idx_1 = find( Matrix_All(:,1) == Median_All(1) & Matrix_All(:,2) ~= Median_All(2) & Matrix_All(:,3) ~= Median_All(3));
idx_2 = find( Matrix_All(:,1) ~= Median_All(1) & Matrix_All(:,2) == Median_All(2) & Matrix_All(:,3) ~= Median_All(3));
idx_3 = find( Matrix_All(:,1) ~= Median_All(1) & Matrix_All(:,2) ~= Median_All(2) & Matrix_All(:,3) == Median_All(3));
Mat_1 = Matrix_All(idx_1,:);
Mat_2 = Matrix_All(idx_2,:);
Mat_3 = Matrix_All(idx_3,:);
  7 Comments
Yaser Khojah
Yaser Khojah on 25 Mar 2019
Dear Guiliaume, Sorry I could not get back to you since I did not have access to my MATLAB. Below is what i want to do but not manually since I have to find do that for different criteria.
idx_1 = MaT_All(:,1) == Median_All(1) & MaT_All(:,2) ~= Median_All(2)...
& MaT_All(:,3) ~= Median_All(3) & MaT_All(:,4) ~= Median_All(4)...
& MaT_All(:,5) ~= Median_All(5) & MaT_All(:,6) ~= Median_All(6)...
& MaT_All(:,7) ~= Median_All(7) & MaT_All(:,8) ~= Median_All(8);
Mat_1 = MaT_All(idx_1,:);
scatter(MaT_All(idx_1,18),MaT_All(idx_1,17)); hold on;
idx_2 = MaT_All(:,1) ~= Median_All(1) & MaT_All(:,2) == Median_All(2)...
& MaT_All(:,3) ~= Median_All(3) & MaT_All(:,4) ~= Median_All(4)...
& MaT_All(:,5) ~= Median_All(5) & MaT_All(:,6) ~= Median_All(6)...
& MaT_All(:,7) ~= Median_All(7) & MaT_All(:,8) ~= Median_All(8);
Mat_1 = MaT_All(idx_2,:);
scatter(MaT_All(idx_2,18),MaT_All(idx_2,17)); hold on;
Is it because if the median is found multiple time you only pick one answer where in my case I select all of them?

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 22 Mar 2019
matches_median = bsxfun(@eq, MaT_All, Median_All);
matches_one = find(sum(matches_median,2) == 1);
matches_which = 1 + sum( cumprod(~matches_median(matches_one,:), 2), 2 );
Mat = cell(8,1);
for G = 1 : 8
Mat{G} = MaT_All(matches_one(matches_which==G),:);
end
  2 Comments
Walter Roberson
Walter Roberson on 25 Mar 2019
The data you have provided us only has 10 columns, so looking at column 18 vs column 17 does not make any sense to us.

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!