Найти последний истинный элемент столбцов - PullRequest
3 голосов
/ 10 февраля 2020

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

Итак, учитывая матрицу 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 ]

3 голосов
/ 10 февраля 2020

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

[~, idx] = max((1:size(i, 1)).' .* i, [], 1, 'linear') ;
x = m(idx) ;
3 голосов
/ 10 февраля 2020

Это будет сделано

m(max(i.*reshape([1:numel(m)],size(m))))

Пояснение

Итак, мы генерируем массив индексов

reshape([1:numel(m)],size(m))

ans =

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

Это представляет индексы для каждого значения. Мы умножаем это на I, чтобы получить интересующие нас значения

i.*reshape([1:numel(m)],size(m))
ans =

1    0    0   13
0    6    0    0
0    0    0   15
0    8   12    0

Затем мы делаем max для этого, поскольку max работает со столбцами. Это даст нам последний индекс в каждом столбце.

max(i.*reshape([1:numel(m)],size(m)))
ans =

1    8   12   15

Затем примените эти индексы к m, чтобы получить значения

m(max(i.*reshape([1:numel(m)],size(m))))
ans =

   16   14   15   12
1 голос
/ 10 февраля 2020

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

[~, col] = find(i); % column indices
lin = find(i); % linear indices
x = accumarray(col, m(lin), [], @(x) x(end));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...