Отображение элементов в векторе на связанный, но больший вектор - PullRequest
0 голосов
/ 28 сентября 2018

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

У меня есть входные векторы одинакового размера: A = [2 3 5] и B = [0,1 0,3 0,23].Вектор A содержит данные индекса и вектора B.Третий входной вектор задается как C = [2 2 2 3 3 3 3 5 5], и теперь я хочу сгенерировать вектор D = [0,1 0,1 0,1 0,3 0,3 0,3 0,3 0,23 0,23].

Как можноЯ в Matlab генерирую вектор D, не используя циклы for?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Вы также можете использовать unique для поиска индекса каждого элемента в C, предполагая, что значения точно соответствуют значениям в A.Если A не отсортировано, то сначала нужно отсортировать элементы B, чтобы соответствовать индексации, заданной unique:

A = [2 3 5];
B = [0.1 0.3 0.23];
C = [2 2 2 3 3 3 3 5 5];

[~,isort] = sort(A);
Bsort = B(isort);    % sorted according to A
[~,~,k] = unique(C); % indices of items in C to pick from A
D = Bsort(k);        % each matching element from (sorted) B
0 голосов
/ 28 сентября 2018

Если элементы вектора индекса являются положительными целыми числами, вы можете просто использовать индексирование:

idx(A,1) = 1:numel(A);
D = B(idx(C));

Если A содержит положительные целые числа больших значений, вы можете использовать разреженную матрицу:

idx = sparse(A,1,1:numel(A));
D = B(idx(C));
0 голосов
/ 28 сентября 2018
A = [2 3 5];
B = [0.1 0.3 0.23];
C = [2 2 2 3 3 3 3 5 5];

Используйте второй вывод ismember для создания вектора индекса:

[~, ind] = ismember(C, A);
D = B(ind);

В качестве альтернативы используйте interp1:

D = interp1(A, B, C);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...