2012-03-26 4 views
1

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

Например:

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

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

дубликата [Изменение значения нескольких точек в матрице] (http://stackoverflow.com/questions/6850368/change-the-value-of-mulitple-points-in-a-matrix) и [Matlab: назначить матрице с столбцами \ row index pairs] (http://stackoverflow.com/q/7119581/52738) , – gnovice

ответ

1

Это не очень, но это один лайнер:

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

Привет, Крис, спасибо за ваш ответ, но можете ли вы объяснить мне, в чем заключается идея этой строки: index = numRows * (colIndex - 1) + rowIndex? –

+0

Спасибо, я нашел ответ сам! –

0

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

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 
Смежные вопросы