我有一個35 x 24
數字矩陣。 35行中的每一行顯然都具有最大值。我正在嘗試寫一小段代碼來確定24列中的哪一列包含這些最大值中的大部分。問題是不允許循環。列中出現最大值的頻率
例如,如果30個不同行的最大值都出現在第7列,那麼我希望MATLAB返回答案7
,因爲這是具有最大行值的列。
我有一個35 x 24
數字矩陣。 35行中的每一行顯然都具有最大值。我正在嘗試寫一小段代碼來確定24列中的哪一列包含這些最大值中的大部分。問題是不允許循環。列中出現最大值的頻率
例如,如果30個不同行的最大值都出現在第7列,那麼我希望MATLAB返回答案7
,因爲這是具有最大行值的列。
如果每一行中值是唯一的,我們可以簡單地使用max
與mode
相結合的第二輸出找出哪一列包含最大的每一行的最頻繁。
% 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));
我認爲你正在尋找這樣的:
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))
你的意思是'bsxfun(@eq,A,max(A,[],2))'? –
@LuisMendo我在網上查了八度解決方案,我想matlab確實有點嚴格。 –