[英]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。
以下是三種您可以做的事情:
letters = unique(part(:)).'; %'// these are the letters in your file h = sum(bsxfun(@eq, part(:), letters)); %// count occurrences of each letter
以上方法的第二行可以由histc
替換,指定bin邊緣:
letters = unique(part(:)).'; h = histc(part, letters);
或者您可以使用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.