2011-05-04 64 views
1

這與this other question非常密切相關,但該問題想要避免sub2ind,因爲性能問題。我更關心使用sub2ind的「不雅」。matlab:尋址一個索引沒有sub2ind

我們假設我想創建另一個MxN矩陣,除了每列中的一個條目外,我想從矢量中的相應條目中分配一個全零矩陣,並且每列中行的選擇都基於另一個矢量。例如:

z = zeros(10,4); 
rchoice = [3 1 8 7]; 
newvals = [123 456 789 10]; 
% ??? I would like to set z(3,1)=123, z(1,2)=456, z(8,3)=789, z(7,4)=10 

我可以使用sub2ind來完成這項(我在an answer to a closely related question使用):

z(sub2ind(size(z),rchoice,1:4)) = newvals 

但有另一種選擇?看起來像邏輯尋址可以某種方式使用,但是我很困惑,因爲爲了將邏輯矩陣的元素設置爲1,您需要處理與您實際需要處理的矩陣中相同的元素位置。

回答

2

有做這件事的簡單的方法。

nCols=size(z,2); 
z(rchoice,1:nCols)=diag(newvals); 
+1

聰明你,獎勵你應該...... – 2011-05-04 20:58:52

+0

這實際上創建一個NxN矩陣,或者是MATLAB足夠聰明,知道我的意思嗎?如果我有1000個值,這是行不通的還是內存不足? – 2011-05-04 21:00:11

+0

'diag'將創建一個'NxN'矩陣。我沒有打擾使用稀疏,因爲這只是一個概念性的例子。如果你有大量的值,你可以使用'spdiags(newvals',0,N,N)'。這隻使用'N'元素,所以不會耗盡內存。 – abcd 2011-05-04 21:04:17

2

您只需將前幾列中的行數加到rchoice即可直接得到線性索引。

nRows = size(z,1); %# in case you don't know this already 
nCols2write = length(newvals); 
z(rchoice+[0:nRows:(nRows*(nCols2write-1)]) = newvals; 
+0

適用於2D(以及我鏈接到的或者我認爲我鏈接到的,提及這種方法作爲對sub2ind的性能改進),所以+1,但似乎很難適合3D或更高版本。 – 2011-05-04 21:02:00

+0

@Jason:儘管不像2D情況那麼簡單,但它肯定可以以ND矩陣的直接方式計算索引...查看[this]的回答(http://stackoverflow.com/questions/5598900/how-can-i-index-the-diagonals-of-a-3-d-matrix-in-matlab/5598991#5598991)question and [this](http://stackoverflow.com/questions/5319178/how -can-i-assign-a-value-to-the-diagonals-of-a-4-d-matrix-using-linear-indexing-i/5319338#5319338)以獲得關於3D和4D矩陣中的線性索引的示例。 – abcd 2011-05-04 21:09:16