Как разделить вектор со ссылкой на другой вектор в Matlab? - PullRequest
1 голос
/ 25 февраля 2012

Мне интересно, смогу ли я сделать следующее эффективно в Matlab. Написать наивный цикл для этой проблемы довольно просто, но я пытаюсь выяснить, есть ли какие-нибудь специализированные функции, которые можно было бы использовать (возможно, arrayfun / accumarray (?) - и то, и другое, с чем мне трудно разобраться! ) Заранее спасибо.

Допустим, у меня есть два вектора следующим образом (в Matlab):

A = [15 4 9 6 7 5 11 3 14]; 
B = [2 7 13]; 

Я бы хотел сделать следующее:

  1. Сортировка B, если еще не отсортирована.
  2. Для каждого последующего окна в B (то есть, [2,7], [7,13]) найдите соответствующие элементы в A, которые лежат в окне.
  3. В этом «разбитом» 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 или все-таки следует пройти через простой цикл? Спасибо!

1 Ответ

2 голосов
/ 25 февраля 2012

Это можно сделать довольно легко, используя функцию histc, чтобы определить, в каком бине (то, что вы называли "окном") есть значения.

A = [15 4 9 6 7 5 11 3 14];
B = [2 7 13];
B = sort(B); 
[~, bin] = histc(A, B);
A = A - bin;

редактирование: Я заметил, что мое решение отличается от вашего, но я подозреваю, что вы ошиблись в своих расчетах. Нужно ли вычитать 2 из значений во втором бункере или вы оставляете их как есть? Если вы хотите изменить только значения в первом бине, последняя строка должна выглядеть следующим образом: A(bin==1) = A(bin==1) - 1.

A = [15 4 9 6 7 5 11 3 14]; % initial value of A
A = [15 3 9 5 7 4 11 2 14]; % your reference result
A = [15 3 7 5 5 4  9 2 14]; % my result (as above)
A = [15 3 9 5 7 4 11 2 14]; % my result with A(bin==1) = A(bin==1) - 1

Чтобы изменить то, в какой ячейке должно появиться значение на краю ячейки, вы можете попытаться добавить / вычесть eps из B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...