我是matlab的新手并试图编写生命游戏。但是我在制作neigbors的总和方面遇到了一些困难。每个单元格的值都可以是0或1.我正在尝试使用一个计数器(就像在Python中,我唯一熟悉的程序),但这似乎不起作用。问题是必须对所有细胞起作用,边界细胞也是如此。如果我有每个单元格的值(因此它将介于0到8之间),我必须实现规则。但我也不知道这是否正确。请帮忙!我变得绝望了!
TIME = 50;
pulsar;
life = {}; % create list 'life'
life{1} = X; % add seed to life
numrows = size(X,1); % calculate number of rows
numcolumns = size (X,2); % calculate number of columns
current = X; % make seed the first current(matrix you're starting off with in each step)
for i = 0:TIME; % determine amount of times the loop will run
for row = 1:numrows; % for each row
for column = 1:numcolumns; % for each column
if column + 1 ~= numcolumns + 1
east_of_row = column + 1; % define how to count the cell right of target cell
end
if column - 1 ~= 0
west_of_row = column - 1; % define how to count the cell left of target cell
end
if row - 1 ~= 0
north_of_column = row - 1; % define how to count the cell north of target cell
end
if row + 1 ~= numrows + 1
south_of_column = row + 1;
end
neighbors = 0 % start counter 'neighbors' with 0
if current(row,east_of_row) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
if current(row,west_of_row) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
if current(north_of_column,column) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
if current(south_of_column,column) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
if current(south_of_column,east_of_row) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
if current(north_of_column,east_of_row) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
if current(north_of_column,west_of_row) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
if current(south_of_column,west_of_row) == 1; % if neighboring cell has a value of 1
neighbors = neighbors + 1; % add 1 to neighbors
end
% rules of the game:
if current(row,column) == 1; % in case a target cell has a value of 1:
if neighbors < 2 % if the number of neighbors is smaller than 2
nextnext(row,column) = 0; % value of target cell gets 0 in nextnext
end
if neighbors == 2 % if the number of neighbors is 2 or 3
nextnext(row,column) = 1; % value of target cell stays 1 in nextnext
end
if neighbors == 3
nextnext(row,column) = 1;
end
if neighbors > 3 % if the number of neigbors is higher than 3
nextnext(row,column) = 0; % value of target cell gets 0 in nextnext
end
end
if current (row,column) == 0 % in case a target cell has a value of 0:
if neighbors == 3 % if the number of neighbors is 3
nextnext(row,column) = 1; % value of target cell gets 1 in nextnext
end
if neighbors ~= 3 % if the number of neigbors isn't 3
nextnext(row,column) = 0; % value of target cell stays 0 in nextnext
end
end
end
end
current = nextnext; % make nextnext matrix the current matrix for the next step
%life{TIME} = nextnext; % add matrix to list 'life
end
show(life);
答案 0 :(得分:2)
您可以使用conv2
计算此值,如下所示:
%First create some example matrix
% (this is a 5 x 5 matrix with 30% 1's, 70% 0's
x = full(ceil(sprand(5,5,0.3)))
%Create your convolution kernal
% This will add up all the values in the 8 elements surrounding the
% central element
k = [1 1 1; 1 0 1; 1 1 1];
%Now do the copnvulution (using the 'same' argument to select an output
%the same size as the input.)
counts = conv2(x,k,'same')
每次都会创建一个略有不同的示例。但是对于上面代码的一次执行,我得到以下结果:
x =
0 1 0 1 0
0 1 0 1 0
0 0 1 1 0
0 1 0 1 0
0 0 0 0 0
counts =
2 1 4 1 2
2 2 6 3 3
2 3 5 3 3
1 1 4 2 2
1 1 2 1 1