如果我有一个矩阵A,例如:
63 55 85 21 71
80 65 85 48 53
55 60 93 71 66
21 65 40 33 21
61 90 80 48 50
...等等我如何找到每列的最小值并完全从矩阵中删除这些数字,这意味着我总体上会减少一行。
我虽然使用:
[C,I] = min(A);
A(I) = [];
但这不会删除必要的数字,并且重塑也不会起作用。我希望这可以使用任意数量的行和列。
答案 0 :(得分:4)
A = [
63 55 85 21 71
80 65 85 48 53
55 60 93 71 66
21 65 40 33 21
61 90 80 48 50
];
B = zeros( size(A,1)-1, size(A,2));
for i=1:size(A,2)
x = A(:,i);
maxIndex = find(x==min(x(:)),1,'first');
x(maxIndex) = [];
B(:,i) = x;
end
disp(B);
另一种矢量化解决方案:
M = mat2cell(A,5,ones(1,size(A,2)));
z = cellfun(@RemoveMin,M);
B = cell2mat(z);
disp(B);
function x = RemoveMin(x)
minIndex = find(x==min(x(:)),1,'first');
x(minIndex) = [];
x = {x};
end
另一种解决方案:
[~,I] = min(A);
indexes = sub2ind(size(A),I,1:size(A,2));
B = A;
B(indexes) = [];
out = reshape(B,size(A)-[1 0]);
disp(out);
我个人更喜欢第一个因为:
但当然,由你决定。
答案 1 :(得分:0)
如果将min
生成的行索引转换为linear indices,则原始方法有效:
[m, n] = size(A);
[~, row] = min(A,[],1);
A(row + (0:n-1)*m) = [];
A = reshape(A, m-1, n);