Удалить минимальные значения для каждого столбца матрицы - PullRequest
2 голосов
/ 05 февраля 2012

Если бы у меня была матрица А, такая как:

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 ]

4 голосов
/ 06 февраля 2012
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. Ибо петли не являются злом - во многих случаях они на самом деле быстрее (с помощью JIT-оптимизатора)
  2. Алгоритм более понятен разработчику, который читает ваш код.

Но, конечно, решать вам.

0 голосов
/ 30 мая 2015

Ваш оригинальный подход работает, если вы преобразуете индексы строк, следующие из min в линейные индексы :

[m, n] = size(A);
[~, row] = min(A,[],1);
A(row + (0:n-1)*m) = [];
A = reshape(A, m-1, n);
...