n=50;
m=50;
k=20;%执行次数
z=zeros(n,m);
ve=z;
number=37;
r=z; %r为边界 初始化
r([5,45],:)=1;%边界值为1
r(:,[5,45])=1;
ve=r;%veg此时为边界(值均为1)加一个值为37的点
ve(25,25)=37;
for i=1:k
X=find(ve==1);%寻找边界的序号 保存在X 因为靠近值为37的边界会被更新为37 所以需要还原 每次扩散步长为1 所以不会越出边界
ve=number*((ve(1:n,[m 1:m-1])==number)|(ve(1:n,[2:m 1])==number)| ...
(ve([n 1:n-1], 1:m)==number)|(ve([2:n 1],1:m)==number)|(ve(:,:)==number)+z);%(A|B|C|D)括号里面命题ABCD用逻辑词|连接会将矩阵ve转换为逻辑矩阵(只能赋值为0或1)
%所以可以与0矩阵运算一下变为double矩阵
ve(X)=1; %还原边界值
end
image(cat(3,ve,z,z));
若用for循环 不能产生理想的效果 原因是每一个值更新后 会影响与它靠近的下一个元素
而逻辑运算利用的数据是默认不变的 然后一次性全部更新
此方法可对区域内部所有点赋值编为相同号 从而方便判断某点处于哪个区域
具体操作可先用ginput()获得边界内部一点值 然后赋值为区域编号 调用上述方法即可
%%%%参数
n=50;
m=50;
k=20;