通常情况下,利用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