我有一個[500x500]的矩陣。我有另一個矩陣[2x100],其中包含可能位於第一個矩陣內的座標對。我希望能夠將第一個矩陣的所有值更改爲零,而無需循環。如何更改矩陣中多個點的值?
mtx = magic(500);
co_ords = [30,50,70; 30,50,70];
mtx(co_ords) = 0;
我有一個[500x500]的矩陣。我有另一個矩陣[2x100],其中包含可能位於第一個矩陣內的座標對。我希望能夠將第一個矩陣的所有值更改爲零,而無需循環。如何更改矩陣中多個點的值?
mtx = magic(500);
co_ords = [30,50,70; 30,50,70];
mtx(co_ords) = 0;
您可以使用功能SUB2IND到你的下標對轉換爲線性指數做到這一點:
mtx(sub2ind(size(mtx),co_ords(1,:),co_ords(2,:))) = 0;
另一個答案:
mtx(co_ords(1,:)+(co_ords(2,:)-1)*500)=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;
我不同意這是上述鏈接問題的確切副本。雖然解決方案將使用相同的方法,但這個方法涉及*賦值*矩陣,而不是從*矩陣索引,所以每個單獨的問題都是有意義的。 – gnovice
@gnovice我投票刪除了另一個問題,因爲它的措辭比這個更糟糕。我不同意訪問和分配之間的差異值得兩個單獨的問題。 – Shai