Matlab如何實現樹結構,Matlab 如何實現樹結構

時間 2021-05-05 14:49:05

1樓:shine戚七七

由於matlab函式只能傳值傳遞引數的限制,操作起來稍有點不同。

建立初始化連結串列空間:

[l,maintain]=initlist(n,'a1','a2','a3',......);

例子:現在需要建立一樹,每個節點包含資料域,左指標域,和右指標域,估計需要的空間是100

[l,maintain]=initlist(100,'lcur','rcur');

這樣就得到一個主連結串列空間l,和一個維護陣列maintain。

l =1x100 struct array with fields:

data

lcur

rcur

分配指標:

[p,maintain]=malloc(maintain);

這裡p就是分配到的指標號,注意一定要返回maintain這個維護陣列(因為matlab函式只能傳值傳遞引數的原因)。然後就可操作了,比如l(p).data=1,賦值操作,和c裡的p->data=1差不多意思。

釋放指標:

maintain = free(maintain,p)

在這裡p是要釋放的指標。

2樓:匿名使用者

樹結構其實就是遞迴結構,matlab的每個元素可以是任意型別的,實際上就等於可以定義樹結構了.其實只要有陣列結構就可以定了樹了。可以看看 http:

給出的解釋。也可以參考c資料結構的書。

求決策樹源**。最好使用matlab實現。

3樓:匿名使用者

function [tree rulesmatrix]=decisiontree(dataset,attributname)

%輸入為訓練集,為離散後的數字,如記錄1:1 1 3 2 1;

%前面為屬性列,最後一列為類標

if nargin<1

error('請輸入資料集');

else

if isstr(dataset)

[dataset attributvalue]=readdata2(dataset);

else

attributvalue=;

endend

if nargin<2

attributname=;

endattributs=[1:size(dataset,2)-1];

tree=creattree(dataset,attributs);

disp([char(13) 'the decision tree:']);

showtree(tree,0,0,1,attributvalue,attributname);

rules=getrule(tree);

rulesmatrix=zeros(size(rules,1),size(dataset,2));

for i=1:size(rules,1)

rule=cell2struct(rules(i,1),);

rule=str2num([rule.str([1:(find(rule.

str=='c')-1)]) rule.str((find(rule.str=='c')+1):

length(rule.str))]);

for j=1:(length(rule)-1)/2

rulesmatrix(i,rule((j-1)*2+1))=rule(j*2);

endrulesmatrix(i,size(dataset,2))=rule(length(rule));

endend

function tree=creattree(dataset,attributs) %決策樹程式 輸入為:資料集,屬性名列表

%disp(attributs);

[s valrecords]=computentropy(dataset,0);

if(s==0) %當樣例全為一類時退出,返回葉子節點類標

for i=1:length(valrecords)

if(length(valrecords(i).matrix)==size(dataset,1))

break;

endend

tree.attribut=i;

tree.child=;

return;

endif(length(attributs)==0) %當條件屬性個數為0時返回佔多數的類標

mostlabelnum=0;

mostlabel=0;

for i=1:length(valrecords)

if(length(valrecords(i).matrix)>mostlabelnum)

mostlabelnum=length(valrecords(i).matrix);

mostlabel=i;

endend

tree.attribut=mostlabel;

tree.child=;

return;

endfor i=1:length(attributs)

[sa(i) valrecord]=computentropy(dataset,i);

gains(i)=s-sa(i);

atrributmatric(i).val=valrecord;

end[maxval maxindex]=max(gains);

tree.attribut=attributs(maxindex);

attributs2=[attributs(1:maxindex-1) attributs(maxindex+1:length(attributs))];

for j=1:length(atrributmatric(maxindex).val)

dataset2=[dataset(atrributmatric(maxindex).val(j).matrix',1:

maxindex-1) dataset(atrributmatric(maxindex).val(j).matrix',maxindex+1:

size(dataset,2))];

if(size(dataset2,1)==0)

mostlabelnum=0;

mostlabel=0;

for i=1:length(valrecords)

if(length(valrecords(i).matrix)>mostlabelnum)

mostlabelnum=length(valrecords(i).matrix);

mostlabel=i;

endend

tree.child(j).root.attribut=mostlabel;

tree.child(j).root.child=;

else

tree.child(j).root=creattree(dataset2,attributs2);

endend

endfunction [entropy recordval]=computentropy(dataset,attribut) %計算資訊熵

if(attribut==0)

clnum=0;

for i=1:size(dataset,1)

if(dataset(i,size(dataset,2))>clnum) %防止下標越界

classnum(dataset(i,size(dataset,2)))=0;

clnum=dataset(i,size(dataset,2));

recordval(dataset(i,size(dataset,2))).matrix=;

endclassnum(dataset(i,size(dataset,2)))=classnum(dataset(i,size(dataset,2)))+1;

recordval(dataset(i,size(dataset,2))).matrix=[recordval(dataset(i,size(dataset,2))).matrix i];

endentropy=0;

for j=1:length(classnum)

p=classnum(j)/size(dataset,1);

if(p~=0)

entropy=entropy+(-p)*log2(p);

endend

else

valnum=0;

for i=1:size(dataset,1)

if(dataset(i,attribut)>valnum) %防止引數下標越界

clnum(dataset(i,attribut))=0;

valnum=dataset(i,attribut);

valueexamnum(dataset(i,attribut))=0;

recordval(dataset(i,attribut)).matrix=; %將編號保留下來,以方便後面按值分割資料集

endif(dataset(i,size(dataset,2))>clnum(dataset(i,attribut))) %防止下標越界

value(dataset(i,attribut)).classnum(dataset(i,size(dataset,2)))=0;

clnum(dataset(i,attribut))=dataset(i,size(dataset,2));

endvalue(dataset(i,attribut)).classnum(dataset(i,size(dataset,2)))= value(dataset(i,attribut)).classnum(dataset(i,size(dataset,2)))+1;

valueexamnum(dataset(i,attribut))= valueexamnum(dataset(i,attribut))+1;

recordval(dataset(i,attribut)).matrix=[recordval(dataset(i,attribut)).matrix i];

endentropy=0;

for j=1:valnum

entropys=0;

for k=1:length(value(j).classnum)

p=value(j).classnum(k)/valueexamnum(j);

if(p~=0)

entropys=entropys+(-p)*log2(p);

endend

entropy=entropy+(valueexamnum(j)/size(dataset,1))*entropys;

endend

endfunction showtree(tree,level,value,branch,attributvalue,attributname)

blank=;

for i=1:level-1

if(branch(i)==1)

blank=[blank ' |'];

else

blank=[blank ' '];

endend

blank=[blank ' '];

if(level==0)

blank=[' (the root):'];

else

if isempty(attributvalue)

blank=[blank '|_____' int2str(value) '______'];

else

blank=[blank '|_____' value '______'];

endend

if(length(tree.child)~=0) %非葉子節點

if isempty(attributname)

disp([blank 'attribut ' int2str(tree.attribut)]);

else

disp([blank 'attribut ' attributname]);

endif isempty(attributvalue)

for j=1:length(tree.child)-1

showtree(tree.child(j).root,level+1,j,[branch 1],attributvalue,attributname);

endshowtree(tree.child(length(tree.child)).

root,level+1,length(tree.child),[branch(1:length(branch)-1) 0 1],attributvalue,attributname);

else

for j=1:length(tree.child)-1

showtree(tree.child(j).root,level+1,attributvalue,[branch 1],attributvalue,attributname);

endshowtree(tree.child(length(tree.child)).

root,level+1,attributvalue,[branch(1:length(branch)-1) 0 1],attributvalue,attributname);

endelse

if isempty(attributvalue)

disp([blank 'leaf ' int2str(tree.attribut)]);

else

disp([blank 'leaf ' attributvalue]);

endend

endfunction rules=getrule(tree)

if(length(tree.child)~=0)

rules={};

for i=1:length(tree.child)

content=getrule(tree.child(i).root);

%disp(content);

%disp([num2str(tree.attribut) ',' num2str(i) ',']);

for j=1:size(content,1)

rule=cell2struct(content(j,1),);

content(j,1)=;

endrules=[rules;content];

endelse

rules=;

endend

matlab如何輸入函式,matlab 如何輸入導數

數碼答疑 導數採用diff函式 diff s,v n 其中s為求的函式,v是變數,n為求導次數例如 diff t 6 t 6 720一階導數 diff s 二階導數 diff s,2 diff 函式是matlab的符號函式求導。diff 使用說明 diff s,v 對表示式s中指定符號變數v,計算s...

如何執行matlab程式,matlab如何執行程式啊?

佘琇逯儂 兩種執行方法,一種直接複製到command視窗內,就是 這個符號的後面 一種是放在m檔案裡,但是執行時必須在m檔案所在的目錄下才能執行 大哥你少了個賦值的運算,你的執行環境沒錯,就如樓上的,但是你想看的是結果。資料空間中的結果已經執行出來了。1.你如果是在command window中執行...

matlab如何描點畫圖,matlab 如何描點畫圖

智者總要千慮 x 5 5 40 y 0.02 0.04 0.058 0.081 0.103 0.121 0.135 0.154 plot x,y 導超 分析,首先畫出離散點,再進行擬合。用直線擬合。x 5 10 15 20 25 30 35 40 y 0.02 0.04 0.058 0.081 0....