2016-08-24 9 views
1

私はbayesnet toolboxのコードを使って作業しています。特定の関数呼び出しによってどのメソッドがディスパッチされるのかを知るためには苦労しています。関数によって呼び出されるメソッドを決定する

例えば、コール

convert_to_pot(bnet.CPD{e}, pot_type, fam(:), evidence) 

複数convert_to_pot機能(in folders here)がありますが、呼び出されたので、具体的なCPDの種類、およびのために、私が思うに、オブジェクトbnet.CPDのいくつかのプロパティによって決定されます。 CPDノードが離散的であれば、それは@discrete_CPDと呼ばれると思いますが、確かに見る方法はありますか?関数呼び出しの結果である構造体から通知することができます。ありがとう

methods(convert_to_pot)返信は、を返します。


Aを例に

% set up graph and CPD's 
    N = 4; 
    dag = zeros(N,N); 
    C = 1; S = 2; R = 3; W = 4; 
    dag(C,[R S]) = 1; 
    dag(R,W) = 1; 
    dag(S,W)=1; 
    discrete_nodes = 1:N; 
    node_sizes = 2*ones(1,N); 
    bnet = mk_bnet(dag, node_sizes, 'discrete', discrete_nodes); 
    bnet.CPD{C} = tabular_CPD(bnet, C, [0.5 0.5]); 
    bnet.CPD{R} = tabular_CPD(bnet, R, [0.8 0.2 0.2 0.8]); 
    bnet.CPD{S} = tabular_CPD(bnet, S, [0.5 0.9 0.5 0.1]); 
    bnet.CPD{W} = tabular_CPD(bnet, W, [1 0.1 0.1 0.01 0 0.9 0.9 0.99]); 

    %evidence node 
    evidence = cell(1,N); 
    evidence{W} = 2;  
    ns = bnet.node_sizes(:); [2 2 2 2] 
    onodes = find(~isemptycell(evidence)); % 4 
    hnodes = find(isemptycell(evidence)); % 1 2 3 
    pot_type = determine_pot_type(bnet, onodes); % 'd' :discrete 
    fam = family(bnet.dag, 4); % 2 3 4 

働いた関数呼び出しとコメントから

pot = convert_to_pot(bnet.CPD{4}, pot_type, fam(:), evidence) 
%  discrete potential object 
%  domain: [2 3 4] 
%   T: [2x2 double] 
%  sizes: [2 2 1] 

更新をもたらします。

>> methods(bnet.CPD{e}) 

Methods for class tabular_CPD: 

CPD_to_CPT    learn_params   maximize_params   update_ess    
bayes_update_params  log_marg_prob_node  reset_ess    update_ess_simple  
display     log_nextcase_prob_node set_fields    
get_field    log_prior    tabular_CPD    

>> class(bnet.CPD{e}) 

ans = 

tabular_CPD 

>> superclasses(bnet.CPD{4}) 

No class tabular_CPD. 

しかし@tabular_CPDconvert_to_pot機能はありません。

+0

あなたはちょうどmatlabのオーバーロードを指していますか? @ zhqiat; – zhqiat

+0

;はい、私はこれが一種のものだと思います。しかし、私は検索パスがどのように行われているのかわかりません。 – user2957945

答えて

1

私は質問から(私はこのツールボックスがインストールされていませんが)わかりませんが、あなたの説明に基づいて、bnet.CPD {e}がクラスであり、convert_to_potがさまざまなタイプのクラスが可能です。その場合は、おそらく代わりに(bnet.CPD {e})メソッドを試すことができますか?

+0

こんにちはCKT;私は 'メソッド(bnet.CPD {e})'を試していましたが、ある範囲の関数を返しますが、 'convert_to_pot'はそれらの間にありません。私はそれが関連する関数を呼び出すために使用される引数のクラスであると考えていました。上の例の 'class(bnet.CPD {e})'は 'tabular_CPD'です。しかし、['@ tabular_CPD'](https://github.com/bayesnet/bnt/tree/d905c537b8003ab1453a5617a1ad0d83b4de886b/BNT/CPDs/%40tabular_CPD)には' convert_to_pot'メソッドがありません。 – user2957945

+1

別のクラスのサブクラスですか?そうであれば、そのメソッドを持つスーパークラスかもしれません。また、「どの(FUN1、 'IN'、FUN2)」構文を使用して、どのメソッドが呼び出されているかを判断することもできます。 http://www.mathworks.com/help/matlab/ref/which.html – CKT

+0

ありがとうございましたCKT、私は 'convert_to_pot'メソッドにつながる' tabular_CPDで 'convert_to_potを試しました。 (これは、ファイルを右クリックして開くことによっても行うことができます)。これらのアプローチの両方が同じ関数ファイルにつながりますが、間違った方法です。私はそれがスーパークラスを持っているとは思わない。 – user2957945

関連する問題