gpt4 book ai didi

matlab - 网格上癌细胞的模型 split

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:42 25 4
gpt4 key购买 nike

我有一个 5000x5000 的网格,我正在尝试在 MATLAB 中实现一个简单的癌症 split 模型。最初,它选择一个随机点 (x,y) 并使该细胞成为癌细胞。在第一次迭代中,它 split - 父细胞留在原处,子细胞随机分配给任何相邻细胞。
到目前为止很简单。

我的问题是:在连续的迭代中,子细胞通常会被分配给一个已经有癌细胞的细胞。在这种情况下,我希望子单元取代它的位置并将已经存在的单元“碰撞”到相邻的单元。如果相邻的单元格是空的,它就会被填充并且进程停止。如果不是,则已经在该位置的单元格被碰撞,依此类推,直到最后一个单元格找到一个空白空间并且该过程停止。

这应该很简单,但我不知道如何编写代码以及使用哪种循环。
我是物理科学家而不是程序员,所以请像对待傻瓜一样对待我!

最佳答案

这是我一起破解的一个函数,大致符合您提供的规范。

随着癌细胞数量的增加,我的速度确实变慢了。

基本上我有几个变量,表示单元格位置网格的 NxN 矩阵(我称其为 plate,因为网格是现有 matlab 函数的名称)

我可以快速迭代的点向量。我选择一个种子位置,然后运行一个 while 循环,直到网格已满。

在每次循环迭代中,我对每个单元执行以下操作:

  • 生成一个随机数以确定该细胞是否应该 split
  • 生成一个随机的划分方向
  • 找到那个方向的第一个开盘位置
  • 填充那个位置

我还没有广泛测试它,但它似乎有效。

function simulateCancer(plateSize, pDivide)

plate = zeros(plateSize, plateSize);
nCells = 1;
cellLocations = zeros(plateSize*plateSize,2);

initX = randi(plateSize);
initY = randi(plateSize);

cellLocations(nCells,:) = [initX, initY];

plate(initX, initY) = 1;

f = figure;
a = axes('Parent', f);
im = imagesc(plate, 'Parent', a);


while(nCells < (plateSize * plateSize))
currentGeneration = currentGeneration+1;
for i = 1:nCells
divide = rand();
if divide <= pDivide
divideLocation = cellLocations(i,:);
divideDir = randi(4);
[x, y, v] = findNewLocation(divideLocation(1), divideLocation(2), plate, divideDir);
if (v==1)
nCells = nCells+1;
plate(x,y) = 1;
cellLocations(nCells,:) = [x,y];
end
end
end
set(im,'CData', plate);
pause(.1);
end

end

function [x,y, valid] = findNewLocation(xin, yin, plate, direction)
x = xin;
y = yin;
valid = 1;
% keep looking for new spot if current spot is occupied
while( plate(x, y) == 1)
switch direction
case 1 % divide up
y = y-1;
case 2 % divide down
y = y+1;
case 3 % divide left
x = x-1;
case 4 % divide down
x = x+1;
otherwise
warning('Invalid direction')
x = xin;
y = yin;
return;
end

%if there has been a collision with a wall then just quit
if y==0 || y==size(plate,2)+1 || x==0 || x==size(plate,1)+1 % hit the top
x = xin; %return original values to say no division happend
y = yin;
valid = 0;
return;
end

end


end

注意:我没有考虑插入单元格,而是以一种将单元格保留在当前位置并在行/列末尾创建新单元格的方式进行编码。在语义上不同,但在逻辑上它具有相同的最终结果,只要您不关心世代。

关于matlab - 网格上癌细胞的模型 split ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11157349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com