【问题标题】:find the numbers that are NOT most frequent from a matrix in matlab从matlab中的矩阵中找到不是最频繁的数字
【发布时间】:2014-10-09 01:13:00
【问题描述】:

我想从 matlab 中每一列的矩阵中找出不是最频繁的数字

例如..,

 a = [3 3 1 4; 0 0 1 1; 0 1 2 4]

我期待的答案是

[3 3 2 1]

任何帮助将不胜感激。

提前致谢。

问候,

拉贾

【问题讨论】:

  • 在平局的情况下你想如何选择(例如第2列)?

标签: matlab matrix frequency


【解决方案1】:

假设如果tie 用于列中的最小计数,您将选择最小值元素,这是一个基于 bsxfun 的解决方案代码来解决它 -

%%// Unique values across the entire matrix
unqval = unique(a(:))

%// Counts of those unique values for each column
counts = sum(bsxfun(@eq,a,permute(unqval,[3 2 1])),1)

%// Make the zero counts as NaNs as they don't exist at all for a column
counts(counts==0)=NaN

%// Indices for the minimum counts with the minimum valued element in a tie-case
[~,v2] = nanmin(permute(counts,[3 2 1]))

%// Minimum count elements of input for each coloumn, to form the desired output
out = unqval(v2).'

使用for-loop 的替代方法-

alf(1,size(a,2))=0; %// alf would be the desired output
for k = 1:size(a,2)
    unqval = unique(a(:,k));
    [~,ind] = min(histc(a(:,k),unqval));
    alf(k) = unqval(ind);
end

【讨论】:

  • 亲爱的@Divakar,感谢您的想法。它适用于小矩阵,但对于大矩阵“bsxfun”需要很多时间,我的 matlab 卡住了。所以请有任何建议。
  • @user8162 是的,对于您的问题,这基本上是一种蛮力和内存需求的方法。
  • @user8162 查看新方法,看看它是否更适合您的情况!
【解决方案2】:

这给出了平局时的最低值:

u = unique(a(:)).'; %'// find unique values of a
h = histc(a, u); %// count for each value, in each column
h(h==0) = inf; %// mark non-present values
[~, r] = min(h); %// find first (i.e. lowest) value with minimum count
result = u(r); %// build result

【讨论】:

  • 这就是我所缺少的histc(a, u),因为我认为histc 仅适用于向量,但显然矩阵也适用哦!!这一个必须是OP的选择!当然 +1。
  • 另外,unique + histc 在各种应用程序中的应用如此广泛,Mathworks 的人可能会考虑制作一个单独的函数来结合这些! :)
  • 嗨 Luis,我的矩阵是 513x1400。所以 histc 需要很多时间。那么还有什么其他的建议可以让它更快吗?谢谢..
  • @Divakar 我同意!我想念的另一件事是accumarray,第二个参数是矩阵:-)
  • @user8162 如果是内存问题(您是否遇到disk thrashing?),请使用@Divakar 的for 循环方法(我+1),它一次只处理一列,因此可能更节省内存。如果内存不是问题,可能很难加快速度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2021-04-21
  • 2017-09-19
  • 2015-06-14
相关资源
最近更新 更多