我正在研究细胞自动机,但我一直遇到这个问题。我有一个矩阵idxR,它包含零和/或1,具体取决于概率过程:
idxR = ((rRecr>rEmpty)&(rRecr>rAlgae)&(rRecr>rCoral));
现在我想用唯一值替换idxR中的所有值并将其分配给变量colonies。我想出了以下内容:
colonies = idxR;
no = sum(colonies(:)==1)
maxvalue = max(colonies(:));
replace = [1:no]+maxvalue;
ret = reshape(replace,no,1);
colonies(colonies==1) = colonies(colonies==1).*ret;
当我输出colonies
时,它给出了一个只包含1和0的矩阵,而不是一个矩阵,其中所有的都已用增量值替换。我在一个新文件中尝试了这个代码,并为idxR分配了一个随机的零和零的矩阵,然后它似乎工作。所以我想问题在于我的自动机中的矩阵idxR。值得一提的是,idxR包含在for循环中。
有人可以告诉我如何解决这个问题吗?
答案 0 :(得分:0)
如果您正在寻找更“有组织”的方式来到“殖民地”,您可以使用以下代码 -
colonies = double(idxR);
maxvalue = max(colonies(:));
ind1 = find(idxR==1);
colonies(ind1)=maxvalue + (1:numel(ind1));
答案 1 :(得分:0)
除了一个小缺陷外,你的整个逻辑都是正确的。您有idxR
作为逻辑矩阵。因此colonies
也是一个逻辑矩阵。因此,您可以获得预期的输出,直到倒数第二行。当您尝试将每个数字大于1(colonies(colonies==1).*ret;
)的数字数组分配给逻辑矩阵时,最后一行会出现问题。
大于1的元素被剪切为1,因此您只能看到0和1。有一个简单的解决方法。将第一行更改为
colonies = double(idxR);
P.S。答案就在你面前,你只是没有发现它。你写过:
我在一个新文件中尝试了这个代码,并为idxR分配了一个随机1和0的矩阵,然后它似乎有效。
idxR
矩阵必须是双数据类型,如果您使用randi
。