matlab绘图直方图,指示文件中每个字符的总和

时间:2015-06-09 15:11:21

标签: matlab histogram

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

2 个答案:

答案 0 :(得分:3)

由于您拥有uchar数组,因此您知道您的元素将始终位于0:255范围内。在看到TamásSzabó的回答here后,我意识到文本文件中的空字符非常不可能,所以我将忽略它并使用范围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);

答案 1 :(得分:0)

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

如果十个字母是任意的并且事先不知道,则您无法使用hist(..., 10)。请考虑以下示例,其中包含三个任意"字母":

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

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

以下三种方法可以满足您的需求:

  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);
    
  4. 例如,对于part = [1 2 2 10],上述任何一个都给出了预期的结果,

    letters =
         1     2    10
    h =
         1     2     1