0

これは進化ゲームのモランプロセスを説明するための基本的なプログラムですが、Matlabに関する知識が限られているため、コードの意味をすばやく理解するのは困難です。誰かがそれが何を意味するのか説明するのを手伝ってもらえますか?

コードを見ると、私が混乱していることがいくつかあります。

  1. stateコード内の 変数は配列ですか?
  2. が配列の場合state、それはどういう意味ですかstate(2,:), state(:,2), state(:)
  3. 機能においてunique、このステートメントはどういう意味ですか?u(u((1:end-1)')==u((2:end)')) = [];
  4. 機能においてmnrnd、このステートメントはどういう意味ですか?r = find(rand < cumsum(p),1);
  5. frequency = histc(state(:,2), livingTypes)./length(state(:,2));、特にの意味は何histcですか?

関数は次のとおりです。

function state = moranprocess(initialState, nSteps, tau)

    %# assume 1 step if not specified
    if(nargin < 2)
        nSteps = 1;
    end

    %# if it isn't specified, assume frequency indepdence.
    if(nargin < 3)
        tau = 0;
    end

    %# initialize with starting state
    state = initialState;

    %# perform the moran process
    for t = 1:nSteps
        state(selection(state, 0), :) = state(selection(state, tau), :);
    end
end

%# frequency dependent selection with parameter tau determining the 
%# strength of selection
function i = selection(state, tau)

    %# find all of the living types
    livingTypes = unique(state(:,2))';

    %# create a multinomial of living type frequencies.
    frequency = histc(state(:,2), livingTypes)./length(state(:,2));

    %#frequency = makemultinomial(state(:,2));
    fitness = (frequency.^tau)./sum(frequency.^tau);

    %# selection is proportional to fitnesss
    selected_type = livingTypes(mnrnd(1, (frequency.*fitness) ./ sum(frequency.*fitness)));

    %# choose randomly among those of the selected type
    thoseOfSelectedType = find(state(:,2) == selected_type);
    i = thoseOfSelectedType(ceil(length(thoseOfSelectedType)*rand));
end


%# fast unique 
function u = unique(x)    
 u = sort(x(:));    
 u(u((1:end-1)')==u((2:end)')) = []; 
end

%# fast mnrnd 
function r = mnrnd(n,p)
    r = find(rand < cumsum(p),1); 
end
4

1 に答える 1

1

1確かに、それstateは変数であり、2D配列であるかのように見えます。デスクトップにワークスペースウィンドウが表示されている場合(つまり、タイトルWorkspaceが他のウィンドウではないウィンドウ)、変数名をダブルクリックして変数エディターを開くことができるはずです。

2state(2,:)は、2D配列の行2を意味しstateます。state(:)(初心者にとって)やや紛らわしいMatlabの省略形を使用して、すべての要素を state 1Dベクトルと見なします。また、Matlabは配列を列優先の順序で格納することを忘れないでください。Matlabには、1Dインデックスを1Dより大きい配列に使用する機能があります。そうでstate(:,2)ない場合は、自分で遊んでみてください。Matlabの強みの1つは、遊んでもらう準備ができていることです。

u(u((1:end-1)')==u((2:end)')) = []3一度にすべてを取り入れようとすると、表現が混乱するだけです。あなたは少しの注意と注意を払ってそれを解決することができます。内側から開始:のすべての要素(この場合はベクトル)が最初から始まり、1つを除いて最後(1:end-1)の要素まで続くことを意味します。したがって、10個の要素がある場合、この式は要素を選択します。これはMatlabの転置演算子であり、行ベクトルを列ベクトルに変換します(その逆も同様です)。両側に適用されているので、ここで目的があるかどうかはわかりませんが、と同様の表現を試してみてください。 u u1:9'==(1:9)(1:9)'

次に、式u((1:end-1)')==u((2:end)')は、要素が等しいかどうかを比較します。つまり、のu(1:end-1)要素が隣接する要素と同じu(2:end)である場合を見つけます。uMatlabの他のブール演算子と同様に、これは0forfalse1forに戻ります。また、やtrueなどの操作を試してください。この式は、Matlabが論理インデックスと呼ぶものをに返します。つまり、評価の対象となる要素(または)を選択します。 1==11==2uutrue1

最後に、式を使用して、= []Matlabは空の配列をu論理インデックスによって選択されたの要素に割り当てます。この操作により、これらの要素が削除されます。

したがって、これを正しく理解した場合、ステートメントuは前の要素と同じ要素をすべて削除します。

4さて、あなたがあなた自身の仕事のいくつかをするのはずっと過去の時間です。findrandおよびcumsumはすべて基本的なMatlab関数であり、十分に文書化されています。上で提案したように、それらが単独で何をするのかを理解するために少し時間を取ってから、それらのさまざまな組み合わせで遊んでみてください。このナンセンスをこれ以上読むよりも、その方法ではるかに迅速に理解できます。

于 2012-08-24T15:50:33.687 に答える