find the position of all non-zero minimum values in each column of a matrix
6 次查看(过去 30 天)
显示 更早的评论
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 个评论
回答(4 个)
Bruno Luong
2021-5-5
编辑:Bruno Luong
2021-5-5
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 个评论
Walter Roberson
2021-5-4
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 个评论
Walter Roberson
2021-5-6
a = zeros(3);
positions = cellfun(@(A) find(A==reshape(min(A(A~=0)),1,[])), num2cell(a,1), 'uniform', 0)
celldisp(positions)
Image Analyst
2021-5-4
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 个评论
Giannis Nikolopoulos
2021-5-5
1 个评论
Image Analyst
2021-5-5
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.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Interactive Control and Callbacks 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!