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....