find the position of all non-zero minimum values in each column of a matrix
8 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hello,
I need your help with the below problem:
I have a matrix something like that:
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
and i need to find the position of all minimum (non-zero) values of each column. For example in the first column the position of the three ones, in the second column the position of the two two etc...
I think that it is very easy but I'm stuck
Thanks in advance
0 comentarios
Respuestas (4)
Bruno Luong
el 5 de Mayo de 2021
Editada: Bruno Luong
el 5 de Mayo de 2021
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
b=a;
b(b==0)=NaN;
[r,c]=find(b==min(b,[],1));
rmin=accumarray(c(:),r(:),[size(a,2),1],@(r){r});
if ~iscell(rmin) % exceptional case where a contains all 0
rmin = cell(size(rmin));
end
celldisp(rmin)
0 comentarios
Walter Roberson
el 4 de Mayo de 2021
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
positions = cellfun(@(A) find(A==min(A)), num2cell(a,1), 'uniform', 0)
The result has to be a cell array because there are a different number of matches in each column.
8 comentarios
Walter Roberson
el 6 de Mayo de 2021
a = zeros(3);
positions = cellfun(@(A) find(A==reshape(min(A(A~=0)),1,[])), num2cell(a,1), 'uniform', 0)
celldisp(positions)
Image Analyst
el 4 de Mayo de 2021
If you want a lengthier, but less cryptic brute force way of finding the min in each column and the row(s) it occurs at, see this:
a = [2 0 3;1 2 5;0 0 0;1 3 3;0 0 6;0 2 7;1 0 0]
[rows, columns] = size(a)
minOfEachColumn = zeros(columns, 1);
indexesOfEachColumn = cell(columns, 1);
for col = 1 : columns
thisColumn = a(:, col);
% Ignore zeros by setting them to inf.
thisColumn(thisColumn == 0) = inf;
% Get the min value of what's left.
minOfEachColumn(col) = min(thisColumn);
fprintf('For column #%d, the min non-zero value is %f.\n', col, minOfEachColumn(col));
% Get what index(es) that that min occurs at.
indexesOfEachColumn{col} = find(thisColumn == minOfEachColumn(col));
end
minOfEachColumn % Display in command window.
celldisp(indexesOfEachColumn)
0 comentarios
Giannis Nikolopoulos
el 5 de Mayo de 2021
1 comentario
Image Analyst
el 5 de Mayo de 2021
That should not have been needed. Worst case, you would have just had to do a "clear all". I think your "a" was not what you thought it was.
Ver también
Categorías
Más información sobre Interactive Control and Callbacks 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!