簡體   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