我有一个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确实有点严格。 –