删除Matrix每列的最小值

时间:2012-02-05 19:53:43

标签: matlab matrix vectorization

如果我有一个矩阵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) = [];

但这不会删除必要的数字,并且重塑也不会起作用。我希望这可以使用任意数量的行和列。

2 个答案:

答案 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. For循环不是邪恶的 - 很多时候它们实际上更快(通过使用JIT优化器)
  2. 读取代码的开发人员更清楚该算法。
  3. 但当然,由你决定。

答案 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);