我想在MATLAB中實現一個莖和節點算法用於教育目的。在我發佈我的代碼之前,讓我介紹一下我的方法的步驟。讓我們考慮,我們有兩位數字:莖和葉節點算法
A=[20 12 13 21 56 13 16 17 22 23 24];
莖可以通過
stems=fix(A/10)
stems =
2 1 1 2 5 1 1 1 2 2 2
和葉子可以通過
leaf=fix(mod(A,10))
leaf =
0 2 3 1 6 3 6 7 2 3 4
給予我所做的給予,是排序莖和根據那種葉子以及:
[stems, index]=sort(stems,'ascend')
leaf=leaf(index)
stems =
1 1 1 1 1 2 2 2 2 2 5
leaf =
2 3 3 6 7 0 1 2 3 4 6
這是基本的想法:
-
- 計數的每個號碼的出現頻率在
stems
- 計數的每個號碼的出現頻率在
-
-
從
leaf
- 採取許多元件
重複此過程對於每個幹,我在每一步都縮短了leaf
陣列。因此,例如用於stems = 1
,我們有[5 1]
,所以我會
leaf(1:5)
ans =
2 3 3 6 7
leaf(1:5)=[]
leaf =
0 1 2 3 4 6
stems = 2
又是5次,如此反覆:
leaf(1:5)
ans =
0 1 2 3 4
leaf(1:5)=[]
leaf =
6
現在爲stems = 5
,我們有1葉
leaf(1)
ans =
6
爲此,我使用了地圖容器,並且創建了以下代碼:
function stem_leaf_plot(v)
if ~isnumeric(v) % check that program will accept array as a integers
error('Input V must be numeric');
end
stems=fix(v/10);
leaf=fix(rem(v,10));
[stems, index]=sort(stems,'ascend');
leaf=leaf(index);
string_stems=num2str(stems);
%% count occurence of each stem
MAP=containers.Map();
n=length(stems); % total element of stems array
for ii=1:n
if isKey(MAP,string_stems(ii))
MAP(string_stems(ii))= MAP(string_stems(ii))+1;
else
MAP(string_stems(ii))=1;
end
end
MAP_count=length(MAP);
stem=num2str(cell2mat(keys(MAP)));
for jj=1:MAP_count
frequency=(MAP(string_stems(jj)));
fprintf('leafs of stem %d',stem(jj));
disp(leaf(1:frequency));
leaf(1:frequency)=[]; % delete elements step by step
end
end
然而,我的代碼的結果是
stem_leaf_plot(A)
leafs of stem 32 2 3 3 6
leafs of stem 49 7 0 1 2 3 4 6
有什麼不對?
我想我意識到問題 –
你爲什麼在你的例子試圖用容器要做到這一點,而不是與數組一樣?這似乎很清楚,但你不解釋你爲什麼要使用容器。 – Adriaan
頻率計數容器 –