2016-05-26 57 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确实有点严格。 –