通常情况下,利用matlab中的函数tabulate(x)可以用来统计一个数组中各个元素出现的频数,但是怎样用MATLAB 统计一个矩阵中各数字(元素)出现的频数、频率啊?而且当矩阵中出现INF时会报错。下面本文就总结一下解决办法。


1.  tabulate(x(:))可以用于统计矩阵中所有元素的频率和频数;

2. 出现的问题:如下所示,当矩阵中出现inf时,会报错。

err=[5,1,1,1;2,Inf,1,3;3,4,1,4;1,3,2,2];
% err=[0,0,3,3;0,Inf,2,3;1,1,1,5;1,1,1,4]
n=tabulate(err(:));
??? Error using ==> epsClass must be 'single' or 'double'.Error in ==> hist at 90    bins = xx + eps(xx);Error in ==> tabulate at 44[counts values] = hist(y,(1:maxlevels));

可能的原因及解决办法:

1. 应该是tabulate不支持参数里面含inf,你可以先把inf去掉进行统计,然后再单独统计inf个数:

err=[5,1,1,1;2,Inf,1,3;3,4,1,4;1,3,2,2]
k=err(:)
k(isinf(k))=[];
tabulate(k)
inf_num=sum(err(:)==inf)  %inf个数

不过这里面的百分比就不包括inf了,不过可以统计到频数,可以自己计算频率。

2. 另外一个解决办法:可以将inf换作一个负数进行统计,统计完在换回去。如下所示:

err=[5,1,1,1;2,Inf,1,3;3,4,1,4;1,3,2,2]
err(err==inf)=-1
tabulate(err(:))

Value    Count   Percent
     -1        1      6.25%
      1        6     37.50%
      2        3     18.75%
      3        3     18.75%
      4        2     12.50%
      5        1      6.25%
其中-1代表inf
或者转换为字符进行统计也可以:

err=[5,1,1,1;2,Inf,1,3;3,4,1,4;1,3,2,2]
err=num2str(err(:));
tabulate(err)

Value    Count   Percent

      5        1      6.25%

      2        3     18.75%

      3        3     18.75%

      1        6     37.50%

    Inf        1      6.25%

      4        2     12.50%


ok,暂时就总结这些吧!后面再添加。

另可以参考另外一篇文章:http://www.matlabhome.cn/post/30.html