2016-05-26 59 views
3

我有一個35 x 24數字矩陣。 35行中的每一行顯然都具有最大值。我正在嘗試寫一小段代碼來確定24列中的哪一列包含這些最大值中的大部分。問題是不允許循環。列中出現最大值的頻率

例如,如果30個不同行的最大值都出現在第7列,那麼我希望MATLAB返回答案7,因爲這是具有最大行值的列。

回答

2

如果每一行中值是唯一的,我們可以簡單地使用maxmode相結合的第二輸出找出哪一列包含最大的每一行的最頻繁。

% Find the column which contains the maximum value 
[~, column] = max(data, [], 2); 
result = mod(column); 

但是,下面是一個更一般的解決方案,它允許給定的最大值每行出現多次。

maximaPerColumn = sum(bsxfun(@eq, data, max(data, [], 2)), 1); 
result = find(maximaPerColumn == max(maximaPerColumn)); 

說明

首先我們要計算的最大值爲每行(最大跨列,尺寸2)。

rowMaxima = max(data, [], 2); 

然後我們想用一個1替換每一行,如果該值等於該行的最大和0否則。我們可以使用bsxfun輕鬆完成此操作。

isMaxOfRow = bsxfun(@eq, data, rowMaxima); 

然後我們想知道一個給定的列有多少次包含一行的最大值。我們可以簡單地將sum放在列上以獲取此信息。

maximaPerColumn = sum(isMaxOfRow, 1); 

現在我們想找到包含最大值最大值的列。我們使用find,因爲多個列可能包含相同數量的最大值。

result = find(maximaPerColumn == max(maximaPerColumn)); 
0

我認爲你正在尋找這樣的:

sum(A==max(A,[],2)) 

例子:

A = [1 1 1; 
2 2 2; 
3 2 1] 

M = sum(A==max(A,[],2)) 

返回:

[3 2 2] 

第一列擁有最聰明的排最大值。您可以使用find來識別此列。

find(M==max(M)) 
+0

你的意思是'bsxfun(@eq,A,max(A,[],2))'? –

+0

@LuisMendo我在網上查了八度解決方案,我想matlab確實有點嚴格。 –