0

私はMatlabが初めてです。私はこのコードスニペットを読んでいましたが、いくつかの部分(アスタリスクでマークされています)でそれが何を意味するのか理解できません。

function [A1nmb] = moran(initsize, popsize) 
% MORAN generates a trajectory of a Moran type process 
%  which gives the number of genes of allelic type A1 in a population 
%  of haploid individuals that can exist in either type A1 or type A2.
%  The population size is popsize and the initial number of type A1 
%  individuals os initsize. 
%  Inputs: initsize - initial number of A1 genes
%          popsize - the total population size (preserved)

if (nargin==0)
  initsize=10;
  popsize=30;
end

A1nmb=zeros(1,popsize);
A1nmb(1)=initsize;

**lambda = inline('(x-1).*(1-(x-1)./N)', 'x', 'N');
mu = inline('(x-1).*(1-(x-1)./N)', 'x', 'N');**

x=initsize;
i=1;
while  (x>1 & x<popsize+1)
  if (lambda(x,popsize)/(lambda(x,popsize)+mu(x,popsize))>rand)
   x=x+1;
   A1nmb(i)=x;
  else
   x=x-1;
   A1nmb(i)=x;
  end;
  i=i+1;
end;
nmbsteps=length(A1nmb);
***rate = lambda(A1nmb(1:nmbsteps-1),popsize) ...
        +mu(A1nmb(1:nmbsteps-1),popsize);***  

**jumptimes=cumsum(-log(rand(1,nmbsteps-1))./rate);**
jumptimes=[0 jumptimes];

stairs(jumptimes,A1nmb);
axis([0 jumptimes(nmbsteps) 0 popsize+1]);
4

2 に答える 2

2

マークした最初の行

lambda = inline('(x-1).*(1-(x-1)./N)', 'x', 'N');

インライン関数と呼ばれるものを作成します。これは、数学関数を定義することと同じです。例:

y = inline('x^2')

あなたがすることを可能にするでしょう

>> y(2)
4

これにより、マークした 2 行目がすぐに説明されます。

rate = lambda(A1nmb(1:nmbsteps-1),popsize) ...
    +mu(A1nmb(1:nmbsteps-1),popsize);

とで関数lambda(x,N)の値を計算します。x = A1nmb(1:nmbsteps-1)N = popsize

ここですぐに言いたいのは、 と同じことを達成するために使用される別の形式である無名関数inlineを調べる必要があるということです。ただ、無名関数は一般的により適切にサポートされており、通常は関数よりもはるかに高速ですinline

次に、最後の行については、

jumptimes = cumsum(-log(rand(1,nmbsteps-1))./rate);

ネストされたコマンドです。randは擬似乱数を含む行列を作成し、logは自然対数 ( "ln") であり、新しい行列をcumsum作成します。新しい行列のすべての要素は、入力行列の要素の累積和です。

コマンドが見つかり、doc非常helpに便利です。入力してみてください

doc cumsum 

また

help inline

Matlab コマンド プロンプトで。前のステートメントを構成するコマンドを使用して、もう一度試してください。

一般的なアドバイスとして、ドキュメントを読むのに非常に多くの時間を費やしてください。本当に、新しいコマンドに遭遇するたびに、それについて読んで、理解できるまでサンドボックスで遊んでください。Matlab は、すべてのコマンドを知っている場合にのみ強力になります。また、知っておくべきことがたくさんあります。

于 2012-08-24T07:07:28.327 に答える
0

インライン関数オブジェクトを定義します。たとえば、これ

 lambda = inline('(x-1).*(1-(x-1)./N)', 'x', 'N')

ラムダを 2 つの変数を持つ関数として定義します。lambda(A,n)Matlabを呼び出すと、最初の文字列で定義した関数が単純に展開されます。したがってlambda(A,n)、関数呼び出しで提供する変数を使用します。lambda(A,n)は次のように評価されます。

 (A-1).*(1-(A-1)./n)

指定したパラメーターを使用して関数を展開するだけです。より具体的な詳細については、このリンクをご覧ください http://www.mathworks.co.uk/help/techdoc/ref/inline.html

このcumsum関数は、特定の次元に沿った行列の累積和を返すだけです。ベクトル で cumsum を呼び出すと、結果のX要素の値は、インデックス 1 から までiの要素の合計に等しくなります。たとえば、次のようになります。XiX = [1 2 1 3]

  AA = cumsum(X);

私たちは持っているでしょう

  AA = [1 3 5 8]

詳細と例については、このリンクを参照してください http://www.mathworks.co.uk/help/techdoc/ref/cumsum.html

于 2012-08-24T06:58:45.490 に答える