Matlab: множественное назначение для векторов без цикла - PullRequest
1 голос
/ 26 марта 2012

Есть ли возможность назначить несколько значений для матрицы из другого вектора без цикла?

Например:

У меня есть матрица, заполненная нулями:

matrix=zeros(2);
matrix =

 0     0      
 0     0      

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

 values=[2 1 4;1 2 2]
 values =

        Posx PosY   Value
        2     1     4
        1     2     2

Результат должен выглядеть следующим образом:

matrix = 
             0     2  <-- matrix(values(2,1),values(2,2))=values(2,3) ;     
             4     0  <-- matrix(values(1,1),values(1,2))=values(1,3);

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Это не красиво, но это один вкладыш:

matrix(size(matrix,1) * (values(:,2) - 1) + values(:,1)) = values(:,3)

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

index = size(matrix,1) * (values(:,2) - 1) + values(:,1)

matrix(index) = values(:,3)

Когда вы индексируете матрицу с вектором, она сначала отсчитывает столбцы, а затем по строкам. Чтобы было еще яснее, разбейте первое утверждение еще на несколько:

numRows  = size(matrix,1)
rowIndex = values(:,1)
colIndex = values(:,2)
vals     = values(:,3)
index    = numRows * (colIndex - 1) + rowIndex

matrix(index) = vals

На самом деле, вам не нужно проходить через все трудности построения вектора index, так как для этого существует функция sub2ind:

index = sub2ind(size(matrix), rowIndex, colIndex)

matrix(index) = vals

хотя я думаю, что приятно видеть, как получить результаты, позвонив по номеру sub2index, для вашего собственного образования.

0 голосов
/ 26 марта 2012

Я сделал функцию для этого, вы можете использовать ее, если хотите:

function B = ndassign( A , varargin )
%%% copy A to B, and assign values to A at specified nd indexes
%%% B=ndind(A,X,Y,Z,V)
%%%   ---> B(X(i),Y(i),Z(i))=V(i)
%%% Example:
%%% ndassign(eye(3),[1 2 3],[3 2 1],[4 5 6])
%%% ans =
%%%      1     0     4
%%%      0     5     0
%%%      6     0     1

B=A;
inds=sub2ind(size(A),varargin{1:end-1});
B(inds)=varargin{end};

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