2016-05-26 4 views
3

35 x 24の数値の行列があります。各35行には明らかに最大値があります。私は、これらの最大値の大部分が24個の列のどれに含まれているかを決定する短いコードを書くようにしています。キャッチはループが許されないということです。列に最大値が出現する頻度

たとえば、30個の異なる行の最大値がすべて列7にある場合、MATLABは答えが7であるようにしたいと考えています。

答えて

2

各行の値が一意である場合、単純に最も頻繁に各行の最大値を含む列を把握するmode組み合わせるmaxの第二の出力を使用することができます。

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

ただし、以下に、特定の最大値を1行につき複数回発生させるより一般的な解決策を示します。

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

説明

まず、各列(カラム、寸法2を横切る最大)の最大値を計算したいです。

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

その後、我々は値がそれ以外の場合は、その行のmaxと0に等しい場合1で各行を交換したいです。 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

@ルイスメンド私はオクターブオンラインで解決策をチェックしました。私はmatlabが少し厳しいと思います。 –

関連する問題