MATLAB-利用邏輯運算對當前矩陣狀態一次更新-邊界內部填充

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;%執行次數
number=10;

%%%%初始化
z=zeros(n,m);
ve=z;
S=z;%總集合
r=z;  %r爲邊界 初始化
r([5,45],:)=1;%邊界值爲1
r(:,[5,45])=1;
ve=r;%veg此時爲邊界(值均爲1)
XX=find(ve==1);%尋找邊界的序號 保存在X 因爲靠近值爲37的邊界會被更新爲37 所以需要還原 每次擴散步長爲1 所以不會越出邊界
S(XX)=1;%S是總集合 這一步將邊界包括入內
image(cat(3,S,ve,z));
for kase=1:6   
number=number+1;
[Y,X]=ginput(1);
ve(ceil(X),ceil(Y))=number;
   for i=1:k 
     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(XX)=1; %還原邊界值
   end
N=find(ve==number);%
S(N)=number;%將新結果併入S
image(cat(3,S,ve,z));
end


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章