2011-07-27 77 views
2

我有一個[500x500]的矩陣。我有另一個矩陣[2x100],其中包含可能位於第一個矩陣內的座標對。我希望能夠將第一個矩陣的所有值更改爲零,而無需循環。如何更改矩陣中多個點的值?

mtx = magic(500); 
co_ords = [30,50,70; 30,50,70]; 
mtx(co_ords) = 0; 
+0

我不同意這是上述鏈接問題的確切副本。雖然解決方案將使用相同的方法,但這個方法涉及*賦值*矩陣,而不是從*矩陣索引,所以每個單獨的問題都是有意義的。 – gnovice

+0

@gnovice我投票刪除了另一個問題,因爲它的措辭比這個更糟糕。我不同意訪問和分配之間的差異值得兩個單獨的問題。 – Shai

回答

6

您可以使用功能SUB2IND到你的下標對轉換爲線性指數做到這一點:

mtx(sub2ind(size(mtx),co_ords(1,:),co_ords(2,:))) = 0; 
1

另一個答案:

mtx(co_ords(1,:)+(co_ords(2,:)-1)*500)=0; 
0

我已經就這個問題絆倒而我正在尋找類似的3D問題。我有行和列索引,並且想要改變與這些索引對應的所有值,但是在每個頁面中(所以整個第三維)。基本上,我想執行mtx(row(i),col(i),:) = 0;,但沒有循環遍歷行和列向量。

我想我會在這裏分享我的解決方案,而不是提出一個新的問題,因爲它是密切相關的。

另外一個不同之處在於線性指數從一開始就可以使用,因爲我使用find來確定它們。爲了清楚起見,我將包含該部分。

mtx = rand(100,100,3); % you guessed it, image data 
mtx2d = sum(mtx,3); % this is similar to brightness 
ind = find(mtx2d < 1.5); % filter out all pixels below some threshold 

% now comes the interesting part, the index magic 
allind = sub2ind([numel(mtx2d),3],repmat(ind,1,3),repmat(1:3,numel(ind),1)); 
mtx(allind) = 0;