Создание матрицы из индексов и матрицы значений

StackOverflow https://stackoverflow.com/questions/19825916

  •  05-07-2022
  •  | 
  •  

Вопрос

Я новичок в MATLAB, но я пропустил документацию и не могу найти ответ на то, что я ищу.

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

Например:

Data =

         0         0         0         0         0         0
    3.7417    3.7417    3.7417    7.0711    3.3166    3.3166
    4.2426    4.2426    3.7417    7.0711    5.3852    7.0711
    7.0711    6.0828    5.3852    7.4833    6.0828    7.6158
    7.1414    7.4833    7.8740    8.7750    7.1414    7.8740

а также

Indices =

     1     2     3     4     5     6
     3     3     1     1     6     5
     2     1     2     6     3     4
     4     5     5     2     2     2
     5     4     6     5     1     3

Что я хочу сделать, так это построить квадратную матрицу (размера n на основе самого большого ценного индекса, обнаруженного в матрице индексов), так что первый столбец Indices используется для индексации первого ряда Result матрица и значения Data помещаются в соответствующие места Result Матрица со всеми местами не индексируется с набором данных в 0.

Т.е. с матрицами данных и индексов сверху я хочу, чтобы окончательная матрица выглядела как:

Result =
          0   4.2426    3.7417    7.0711    7.1414         0
     4.2426        0    3.7417    7.4833    6.0828         0
     3.7417   3.7417         0         0    5.3852    7.8740 
     7.0711   7.4833         0         0    8.7750    7.0711
     7.1414   6.0828    5.3852         0         0    3.3166
          0   7.6158    7.8740    7.0711    3.3166         0

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

Есть ли быстрый способ сделать это в Matlab? Многие функции возвращают индексы, и я надеялся, что будет простой способ обновить/построить матрицу, используя эти индексы.

Спасибо,

Грег

Это было полезно?

Решение

Самый чистый способ, которым я знаю, как это сделать, - это создание разреженной матрицы на основе ваших данных и индексов:

[M,N] = size(Indices); indmax = max(Indices(:));
Result = sparse(repmat(1:N,M,1),Indices,Data,indmax,indmax);

Надеюсь, кто -то придет и показывает нам еще более чистый метод.

Другие советы

То, что вы описываете, достигается так:

[II,JJ]=meshgrid(1:size(Data,2),1:size(Data,1));
Result = zeros(size(Data,2));
Result(sub2ind(size(Result),II(:),Indices(:))) = Data(:);

Обратите внимание, что получение II сквозь meshgrid утверждение эквивалентно II=repmat(1:size(Data,2),size(Data,1),1);.

Это решение, основанное на bsxfun, кажется, немного быстрее, чем на @nispio и @chappjc:

S = max(Indices(:));
Result = zeros(S);
Result(bsxfun(@plus, (Indices-1)*S, 1:S)) = Data;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top