2012-03-26 46 views
1

是否有任何可能性從另一個向量中爲一個矩陣賦值多個值而不需要循環?Matlab:對於沒有循環的向量的多重賦值

例如:

我有填充零的矩陣:

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 /改變多值點的矩陣)和[Matlab:分配給列和行索引對的矩陣](http://stackoverflow.com/q/7119581/52738) 。 – gnovice 2012-03-26 13:45:28

回答

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? – 2012-03-26 20:31:58

+0

謝謝,我自己找到了答案! – 2012-03-26 21:13:42

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