了解Matlab代码片段

时间:2012-08-24 15:19:05

标签: matlab

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

如果你看一下代码,有一些我很困惑的事情。

  1. 是代码中的变量state数组吗?
  2. 如果state是一个数组,那么state(2,:), state(:,2), state(:)
  3. 意味着什么
  4. unique函数中,此声明的含义是什么:u(u((1:end-1)')==u((2:end)')) = [];
  5. mnrnd函数中,此声明的含义是什么:r = find(rand < cumsum(p),1);
  6. frequency = histc(state(:,2), livingTypes)./length(state(:,2));的含义是什么, 尤其是histc
  7. 这是功能:

    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
    

1 个答案:

答案 0 :(得分:1)

1当然看起来好像state是一个变量和一个二维数组。如果您的桌面上显示工作区窗口(即标题为Workspace的窗口而不是任何其他窗口),您应该能够双击变量名称并打开变量编辑器。

2 state(2,:)表示2D数组state的第2行; state(:)使用有点混乱(初学者)的Matlab简写来表示 state 中的所有元素被视为一维向量,并且不要忘记Matlab以列主要顺序存储数组。 Matlab可以将1D索引用于大于1 -D数组。你应该能够自己找出state(:,2),如果没有,可以玩游戏; Matlab的优势之一就是让你玩得很开心。

3表达式u(u((1:end-1)')==u((2:end)')) = []只会在您尝试同时将其全部删除时引起混淆。您可以通过一点小心和关注来解决问题。从内部开始:(1:end-1)表示所有元素(在本例中为向量 u )从第一个开始,然后继续到最后一个但只有一个。因此,如果u有10个元素,则此表达式会选择元素1:9'是Matlab的转置运算符,它将行向量转换为列向量(而反之亦然)。由于它已应用于==的两侧,我不确定它在此处是否有任何用途,但可以使用(1:9)(1:9)'以及类似的表达式进行试验。

接下来,表达式u((1:end-1)')==u((2:end)')将元素u(1:end-1)与元素u(2:end)进行相等比较,换句话说,它会找到u元素为0的情况。和邻居一样。与Matlab中的其他布尔运算符一样,这​​将为false返回1,为true返回1==1 - 再次尝试1==2和{{1}等操作}。此表达式将返回Matlab将逻辑索引称为u的内容,即它将选择评估为u的{​​{1}}元素(或true)。

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

所以,如果我正确地认识到这一点,那么该语句将从u中删除与前一个元素相同的所有元素。

4现在,您可以自己做一些自己的工作。 ufindrand都是基本的Matlab函数,这些函数都有详细记录。正如我上面所建议的那样,花点时间弄清楚他们孤立地做了什么,然后开始玩各种组合。你会比通过阅读更多这种方式更快地捕捉到它。