我有一個10乘1000的矩陣,並且想要生成另一個矩陣,以便保留每列中的最大元素並將null或「零」剩下9個條目。生成一個矩陣,其中每個列的最大值保持其他條目爲零
是否有可能在MATLAB中做到這一點?
我有一個10乘1000的矩陣,並且想要生成另一個矩陣,以便保留每列中的最大元素並將null或「零」剩下9個條目。生成一個矩陣,其中每個列的最大值保持其他條目爲零
是否有可能在MATLAB中做到這一點?
我通常不回答這種類型的問題(即給我科迪茲),但我主要回答長壽。這是一個有趣的問題要解決。
無論如何,你所要求的是非常簡單的。使用max
並在您的矩陣的各列中進行操作,並使用第二個輸出max
。這些給你的每個列的行位置給你最大值。 max
的第一個輸出爲每個列提供相應的最大值。
只需創建零矩陣和使用的max
第二輸出來索引到該空白基質並將來自第一輸出到該矩陣中檢索對應的最大值。你只給出的是每個列的行位置。因此,你需要sub2ind
額外的調用來完成,我們需要找到對應於每列各最大值的位置線性指標的分配,而我們最大的每一列的分配到每列每個相應的位置。
因此,假定你的矩陣是X
,只是這樣做:
[Y,ind] = max(X, [], 1);
out = zeros(size(X));
vals = sub2ind(size(X), ind, 1:size(X,2));
out(vals) = Y;
>> rng(123123);
>> X = randi(10,5,5)
X =
4 5 4 8 7
10 2 8 7 2
3 1 9 1 10
9 6 6 4 4
8 3 5 2 4
後運行之初的代碼中,我們得到:
out =
0 0 0 8 0
10 0 0 0 0
0 0 9 0 10
0 6 0 0 0
0 0 0 0 0
上述方法假設每列有個唯一個條目。如果您有具有相同的最大值的多個實例一欄,只有一個這些值的得到保存和列的其餘部分 - 包括其他共享的最大值 - 獲取清零至零。具體來說,遇到的最大值的第一個實例被保存,其他值消失。
這是另一種方法。這使所有列條目等於列的最大值,即使有多個這樣的條目。
讓X
表示矩陣和Y
結果。然後:
Y = X.*bsxfun(@eq, X, max(X));
哦,那當然很聰明。 +1。這也允許每列有多個最大值。 – rayryeng
這很好。祝你好運。有任何代碼讓我們看看? –