Мне интересно, смогу ли я сделать следующее эффективно в Matlab. Написать наивный цикл для этой проблемы довольно просто, но я пытаюсь выяснить, есть ли какие-нибудь специализированные функции, которые можно было бы использовать (возможно, arrayfun
/ accumarray
(?) - и то, и другое, с чем мне трудно разобраться! ) Заранее спасибо.
Допустим, у меня есть два вектора следующим образом (в Matlab):
A = [15 4 9 6 7 5 11 3 14];
B = [2 7 13];
Я бы хотел сделать следующее:
- Сортировка
B
, если еще не отсортирована.
- Для каждого последующего окна в
B
(то есть, [2,7]
, [7,13]
) найдите соответствующие элементы в A, которые лежат в окне.
- В этом «разбитом»
A
, уменьшите в 1 n раз от тех элементов в A
, которые лежат в n-м окне B
.
Пример: В приведенном выше случае первое окно B
имеет значение [2,7]
. Элементы в A, которые находятся в этом окне, [5,4,3,6]
. Поскольку они лежат в первом окне B
, мне нужно уменьшить 1, по одному разу от каждого из этих элементов. Новый A
будет выглядеть следующим образом после этой операции:
A = [15 3 9 5 7 4 11 2 14];
Может ли эта проблема быть сведена к нескольким вызовам функций в Matlab или все-таки следует пройти через простой цикл? Спасибо!