【问题标题】:understanding of Matlab code snippetMatlab代码片段的理解
【发布时间】:2012-08-24 23:51:16
【问题描述】:

这是一个在进化游戏中描述Moran process的基本程序,但是由于我对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

【问题讨论】:

标签: matlab


【解决方案1】:

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

2 state(2,:) 表示二维数组state的第2行; state(:) 使用了一个有点令人困惑的(对于初学者)Matlab 简写来表示 所有元素 state 被认为是一维向量,不要忘记 Matlab 将数组存储在列中-主要订单。 Matlab 可以将一维索引用于大于 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 的元素与其邻居相同的情况。与 Matlab 中的其他布尔运算符一样,这​​将返回 0 用于 false1 用于 true - 再次尝试诸如 1==11==2 之类的操作。这个表达式将返回 Matlab 所称的 逻辑索引u,也就是说,它将选择 u 中评估为 true(或 1)的那些元素。

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

所以,如果我正确理解了这一点,该语句将从u 中删除所有与前一个元素相同的元素。

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

【讨论】:

  • 非常感谢,但我仍然对频率有问题 = histc(state(:,2), livingTypes)./length(state(:,2));是 histc 用于绘图吗?
  • 现在轮到你做一些你自己的工作了,我晚上要走了。 histc 是内置的,因此在线帮助将比我能够或将要更好地解释您需要了解的所有内容。周末愉快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多