这是在进化游戏中描述Moran process的基本程序,但是由于我对Matlab的了解有限,我很难快速理解代码的含义。有人可以帮我解释一下这意味着什么。
如果你看一下代码,有一些我很困惑的事情。
state
数组吗? state
是一个数组,那么state(2,:), state(:,2), state(:)
unique
函数中,此声明的含义是什么:u(u((1:end-1)')==u((2:end)')) = [];
mnrnd
函数中,此声明的含义是什么:r = find(rand < cumsum(p),1);
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
答案 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现在,您可以自己做一些自己的工作。 u
,find
和rand
都是基本的Matlab函数,这些函数都有详细记录。正如我上面所建议的那样,花点时间弄清楚他们孤立地做了什么,然后开始玩各种组合。你会比通过阅读更多这种方式更快地捕捉到它。