35 x 24
の数値の行列があります。各35行には明らかに最大値があります。私は、これらの最大値の大部分が24個の列のどれに含まれているかを決定する短いコードを書くようにしています。キャッチはループが許されないということです。列に最大値が出現する頻度
たとえば、30個の異なる行の最大値がすべて列7にある場合、MATLABは答えが7
であるようにしたいと考えています。
35 x 24
の数値の行列があります。各35行には明らかに最大値があります。私は、これらの最大値の大部分が24個の列のどれに含まれているかを決定する短いコードを書くようにしています。キャッチはループが許されないということです。列に最大値が出現する頻度
たとえば、30個の異なる行の最大値がすべて列7にある場合、MATLABは答えが7
であるようにしたいと考えています。
各行の値が一意である場合、単純に最も頻繁に各行の最大値を含む列を把握する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));
私はあなたがこのために探していると思う:
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))'を意味しますか? –
@ルイスメンド私はオクターブオンラインで解決策をチェックしました。私はmatlabが少し厳しいと思います。 –