如何在MatLab中生成随机分布的数字簇的矩阵?

时间:2015-07-15 20:14:29

标签: arrays matlab matrix random

例如,我可以使用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的子矩阵。

1 个答案:

答案 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;

这是做什么的:

  • 创建填充零的矩阵。
  • 随机找零'零位置。它将成为新广场的左上角。因此,它只寻找零'在有效位置(例如,右下角的零不能用于创建大小>> 2的正方形)。
  • 使用Inf填充该地区。在此之前,它填充区域上方和左侧区域,递增1(Inf' s将不会递增)。这样,在第二步中无法选择那些区域,从而防止重叠。

注意:不保证会创建所有广场。如果矩阵的填充方式没有足够的空间来容纳新的方块,则可能会发生这种情况(根据rowscols和{{的值,可能无法找到解决方案。 1}})。这就是为什么你有nSquares变量,它表示创建了多少个正方形。