0

这是一个描述进化博弈中Moran过程的基本程序,但是由于我对Matlab的了解有限,我很难快速理解代码的含义。有人可以帮我解释一下这是什么意思。

如果您查看代码,我会感到困惑。

  1. 代码中的变量state是数组吗?
  2. ifstate是一个数组,这意味着什么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是一个变量和一个二维数组。如果您的桌面上有工作区窗口(即标题Workspace不是其他任何窗口的窗口),您应该能够双击变量名称并打开变量编辑器。

2state(2,:)表示二维数组的第 2 行statestate(:)使用有点令人困惑的(对初学者来说)Matlab 速记来表示所有元素都 state 被视为一维向量,并且不要忘记 Matlab 以 column-major order 存储数组。Matlab 可以将一维索引用于大于一维的数组。您应该能够弄清楚state(:,2)自己,如果没有,请玩弄;Matlab 的优势之一是它随时准备让你玩。

u(u((1:end-1)')==u((2:end)')) = []3只有当你试图同时接受它时,这种表达才会令人困惑。您可以稍加小心和关注来解决它。从内部开始:(1:end-1)表示(在这种情况下为 vector u )的所有元素从第一个开始,一直到最后一个,但 one。因此,如果u有 10 个元素,则此表达式选择 elements 1:9。这'是 Matlab 的转置运算符,它将行向量转换为列向量(反之亦然)。由于它应用于两侧,==我不确定它在这里有什么用途,但可以尝试使用(1:9)and(1:9)'和类似的表达方式。

接下来,表达式u((1:end-1)')==u((2:end)')比较元素u(1:end-1)与元素的相等性,u(2:end)换句话说,它找到那些元素u与其邻居相同的情况。与 Matlab 中的其他布尔运算符一样,这​​将返回0forfalse1for true—— 再次尝试诸如1==1and之类的操作1==2。这个表达式将返回 Matlab 所称的逻辑索引into u,也就是说,它将选择u评估为true(或1) 的那些元素。

最后,使用表达式= []Matlab 将空数组分配给u由逻辑索引选择的元素。此操作删除那些元素。

因此,如果我正确地弄清楚了这一点,则该语句将从u所有与前一个元素相同的元素中删除。

4 现在是时候做一些自己的工作了。findrand并且cumsum都是有据可查的基本 Matlab 函数。正如我上面建议的那样,花一些时间弄清楚它们孤立地做什么,然后开始尝试它们的各种组合。与阅读更多这种胡言乱语相比,你会以这种方式更快地理解。

于 2012-08-24T15:50:33.687 回答