Indexing with conditions for certain columns
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Yaser Khojah
el 22 de Mzo. de 2019
Comentada: Walter Roberson
el 25 de Mzo. de 2019
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 comentarios
Guillaume
el 22 de Mzo. de 2019
There are no limitation based on the number of columns to doing what you want... whatever that is...
You haven't answered Walter's questions, so we're in the dark about what exactly you're trying to do:
- what if the median is not found anywhere? e.g. median([1 2 3 4]) is 2.5.
- what if the median is found multiple time? e,.g median([1 1 2 2 3 3]) is 2
Perhaps, you should explain what the purpose of all this is. Maybe it's not the median that you actually need.
Note that find was completely unnecessary in your code so far.
idx = Matrix_All(:,1) == Median_All(1) & Matrix_All(:,2) ~= Median_All(2) & Matrix_All(:,3) ~= Median_All(3)
Mat_1 = Matrix_All(idx_1,:);
would have produced the same result (or error).
Yaser Khojah
el 25 de Mzo. de 2019
Editada: Yaser Khojah
el 25 de Mzo. de 2019
Respuesta aceptada
Walter Roberson
el 22 de Mzo. de 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 comentarios
Walter Roberson
el 25 de Mzo. de 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.
Más respuestas (0)
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!