2017-01-31 98 views
0

我想在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 

這是基本的想法:

    1. 計數的每個號碼的出現頻率在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 

有什麼不對?

+0

我想我意識到問題 –

+0

你爲什麼在你的例子試圖用容器要做到這一點,而不是與數組一樣?這似乎很清楚,但你不解釋你爲什麼要使用容器。 – Adriaan

+0

頻率計數容器 –

回答

0

經過@Adriaan的建議,我用hist來計算頻率,而不是容器。這是我更新的代碼:

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); 
[a,b]=hist(stems,unique(stems)); 
n=length(a); 
for ii=1:n 
    fprintf('leaf of stem %d is ',b(ii)); 
    leaf(1:a(ii)) 
    leaf(1:a(ii))=[]; 

end 


     >> A=[20 12 13 21 56 13 16 17 22 23 24]; 
>> stem_leaf_plot(A) 
leaf of stem 1 is 
ans = 

    2  3  3  6  7 

leaf of stem 2 is 
ans = 

    0  1  2  3  4 

leaf of stem 5 is 
ans = 

    6 
+0

我可以使輸出更漂亮一點嗎? –

+0

我不會將輸出轉儲到控制檯,而是將其保存到單元格。如果你想要這個教育目的,你應該把'fprintf'聲明放在'leaf(1:a(ii))'來擺脫'ans ='。另外,我可以在代碼的開頭推薦'format compact',以擺脫控制檯輸出之間的白線。 – Adriaan