例如,我可以使用round(rand(100,100))
生成随机放置的1&0和0的矩阵。
如何生成一个类似的矩阵,而不是1,而是给定数量的给定大小的1的随机分布的正方形子矩阵?例如:
0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0
0 1 1 0 0 0 1 1
0 0 0 0 0 0 1 1
1 1 0 0 1 1 0 0
1 1 0 0 1 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
上面的矩阵有4
个随机放置的1个大小为2
的子矩阵。
答案 0 :(得分:1)
假设它们可能重叠,这是一个可能的答案:
rows = 8;
cols = 8;
nSquares = 4;
sizeSquares = 2;
mat = zeros(rows, cols);
for ii = 1:nSquares
row = randi(rows - sizeSquares + 1);
col = randi(cols - sizeSquares + 1);
mat(row:row+sizeSquares-1,col:col+sizeSquares-1) = 1;
end
结果:
mat =
0 0 0 0 0 0 0 0
0 1 1 0 0 0 1 1
0 1 1 0 0 0 1 1
0 0 0 0 0 0 0 0
0 1 1 0 1 1 0 0
0 1 1 0 1 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
编辑:假设它们不能重叠,这是一种可能的方法:
rows = 8;
cols = 8;
nSquares = 4;
sizeSquares = 3;
mat = zeros(rows, cols);
createdSquares = 0;
for ii = 1:nSquares
[r, c] = find(mat(1:rows - sizeSquares + 1, 1:cols - sizeSquares + 1) == 0);
if isempty(r)
break;
end
idx = randi(numel(r));
row = r(idx);
col = c(idx);
mat(max(1, row - sizeSquares + 1:row + sizeSquares - 1),max(1, col - sizeSquares + 1):col+sizeSquares - 1) = ...
mat(max(1, row - sizeSquares + 1:row + sizeSquares - 1),max(1, col - sizeSquares + 1):col+sizeSquares - 1) + 1;
mat(row:row+sizeSquares-1,col:col+sizeSquares-1) = Inf;
createdSquares = createdSquares + 1;
end
mat = mat == Inf;
这是做什么的:
Inf
填充该地区。在此之前,它填充区域上方和左侧区域,递增1(Inf
' s将不会递增)。这样,在第二步中无法选择那些区域,从而防止重叠。 注意:不保证会创建所有广场。如果矩阵的填充方式没有足够的空间来容纳新的方块,则可能会发生这种情况(根据rows
,cols
和{{的值,可能无法找到解决方案。 1}})。这就是为什么你有nSquares
变量,它表示创建了多少个正方形。