Я хотел бы извлечь одно значение на столбец матрицы, используя условие. Несколько значений в каждом столбце соответствуют этому условию, но следует выбрать только последнее. Можно с уверенностью предположить, что каждая строка содержит хотя бы одно такое значение.

Поэтому, учитывая матрицу NxM и логическое значение одинакового размера, извлеките значения M, для которых логическое значение истинно, и оно является последним истинным значением в столбце. Например:

m = magic(4);
i = (m > 10);

% m =
% 16     2     3    13
%  5    11    10     8
%  9     7     6    12
%  4    14    15     1

% i =
% 1   0   0   1
% 0   1   0   0
% 0   0   0   1
% 0   1   1   0

И ожидаемый результат:

% i_ =
% 1   0   0   0
% 0   0   0   0
% 0   0   0   1
% 0   1   1   0

% x = [16, 14, 15, 12]

Я знаю, что это может быть легко достигнуто путем циклического перебора столбцов и использования find, но, по моему опыту, часто есть лучшие способы постановки этих проблем.

3
Felix 10 Фев 2020 в 17:38

2 ответа

Вы можете использовать второй вывод max, чтобы найти последний истинный элемент каждого столбца. Перед этим логическая матрица должна быть умножена на увеличивающийся вектор столбца.

[~, idx] = max((1:size(i, 1)).' .* i, [], 1, 'linear') ;
x = m(idx) ;
3
rahnema1 10 Фев 2020 в 16:02

Вот еще один способ, используя accumarray:

[~, col] = find(i); % column indices
lin = find(i); % linear indices
x = accumarray(col, m(lin), [], @(x) x(end));
1
Luis Mendo 10 Фев 2020 в 16:28