繁体   English   中英

Matlab图形直方图指示文件中每个字符的总和

[英]matlab plot histogram indicating sum of each character inside a file

我有400个文件,每个文件包含大约500000个字符,而这500000个字符仅由大约20个字母组成。 我想制作一个直方图,指示使用的最多10个字母(x轴)和每个字母的使用次数(y轴)。 我该怎么做。

由于您具有uchar数组,因此您知道元素将始终在0:255范围内。 这里看到TamásSzabó的答案后我意识到在文本文件中完全不可能出现空字符,因此我将忽略它并使用范围1:255 如果希望使用空字符,则必须调整范围。

为了找到10个最常用的字母,我们将首先计算直方图计数,然后按降序对其进行排序,并获取前10个:

counts = histc(uint8(part), [1:255]);
[topCounts, topIndices] = sort(counts, 'descend');

现在我们需要重新排列计数和索引,以按字母顺序将字母放回原位:

[sortedChars, shortIndices] = sort(topIndices(1:10));
sortedCounts = topCounts(shortIndices);

现在我们可以使用bar绘制直方图:

bar(sortedCounts);

(您可以添加'hist'如果你想在触摸就像他们在正常做图的酒吧选项hist情节。)

要将水平图例从数字值更改为字符,请使用sortedChars作为'XtickLabel'

labelChars = cellstr(sortedChars.').';
set(gca, 'XtickLabel', labelChars);

注意 :这将回答问题的原始版本 (数据仅包含10个字母;需要直方图)。 该问题已完全更改 (数据由大约20个字母组成,并且需要10个最常用字母的直方图)。


如果十个字母是任意的并且事先未知,则不能使用hist(..., 10) 考虑以下带有三个任意“字母”的示例:

h = hist([1 2 2 10], 3);

结果不是您期望的[1 2 1] 问题在于hist选择等宽的 bin。

以下是三种您可以做的事情:

  1. 您可以找到具有unique的字母,然后使用bsxfun

     letters = unique(part(:)).'; %'// these are the letters in your file h = sum(bsxfun(@eq, part(:), letters)); %// count occurrences of each letter 
  2. 以上方法的第二行可以由histc替换,指定bin边缘:

     letters = unique(part(:)).'; h = histc(part, letters); 
  3. 或者您可以使用sparse来进行累加:

     t = sparse(1, part, 1); [~, letters, h] = find(t); 

例如,对于part = [1 2 2 10] ,以上任何一项都给出了预期的结果,

letters =
     1     2    10
h =
     1     2     1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM