2015-04-06 31 views

回答

2

我通常不回答這種類型的問題(即給我科迪茲),但我主要回答長壽。這是一個有趣的問題要解決。

無論如何,你所要求的是非常簡單的。使用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 

警告

上述方法假設每列有個唯一個條目。如果您有具有相同的最大值的多個實例一欄,只有一個這些值的得到保存和列的其餘部分 - 包括其他共享的最大值 - 獲取清零至零。具體來說,遇到的最大值的第一個實例被保存,其他值消失。

+0

謝謝rayryeng – mohamed

+1

@mohamed - 我犯了一個小錯誤。請刷新帖子。另外,如果這對您有用,請考慮接受我的答案。這可以通過點擊我帖子頂部的複選標記圖標來完成,在向上和向下投票按鈕的下方左側。只要你能夠。祝你好運! – rayryeng

2

這是另一種方法。這使所有列條目等於列的最大值,即使有多個這樣的條目。

X表示矩陣和Y結果。然後:

Y = X.*bsxfun(@eq, X, max(X)); 
+0

哦,那當然很聰明。 +1。這也允許每列有多個最大值。 – rayryeng

相關問題