使用MATLAB创建拉丁方矩阵

时间:2017-05-31 02:09:02

标签: matlab latin-square

我在MATLAB上非常生疏,我试图通过自动化一些拉丁方问题来解决问题。我正在处理的代码如下:

counter=1;
for i=1:10
    for j=1:10
        if A(i,j)=0
            A(i,j)=[This is where I'm stuck];
        end
        counter=counter+1;
    end
end    

我希望此代码检查A(i,j)中的值,以确定[1,...,n]中的值是否已存在于第i行,然后从

中选择随机值
[1,...,n] excluding [values already present].

基本上我只是试图强行完成部分拉丁方格。

编辑:

我不是要生成随机拉丁方块,而是具有某些属性的拉丁方块。例如,假设我们有以下设置:

A=[X,0,0,0,Y,0,0,0,Z]

其中0,X,Y,Z都是3x3子矩阵,X,Y,Z的值为1,...,9。我正在尝试设计一种自动化方法来完成部分拉丁方块,这些方块具有一些值。

1 个答案:

答案 0 :(得分:0)

您描述的方法不够健壮,无法每次生成拉丁方。例如,假设我们正在计算5x5平方的第二行

1 2 3 4 5
2 4 1 3 ?

前4列符合规则,在每列中选择不会导致行/列冲突的随机值。那么最后一个值必须是5,这是不允许的。你可以添加另一个循环冲突并进行交换的阶段,但如果不仔细构建,这可能是无穷无尽的!

更简单的方法是构建一个简单的"大小为n的拉丁方,格式如下:

A = [1    2    3    ...    n-1  n
     n    1    2    ...    n-2  n-1
     n-1  n    1    ...    n-3  n-2
     ...  ...  ...  ...    ...  ...
     3    4    5    ...    1    2  
     2    3    4    ...    n    1   ]

每行是每行一个元素置换的向量1:n。这可以使用toeplitz

在Matlab中轻松生成
A = toeplitz([1,n:-1:2],1:n);

现在我们有一个拉丁方!您可以通过使行排列随机而非有序来随机化此过程。之后我们可以使用randperm

中的随机索引来对列进行置换
A = A(randperm(n), randperm(n));

注意,这不会产生所有可能的拉丁方格,因为:

" 如果可以通过置换行,列和符号从另一个中获得一个正方形,则两个正方形属于同一同位素类" Brendan McKay

看着课间的跳跃是另一个层次。对于n = 8,有超过100万个类,并且对于更高的值,类的数量会迅速爆炸! Wikipedia

由于有9,982,437,658,213,039,871,725,064,756,920,320,000拉丁方为n = 10 (正如你的尝试)我认为可以肯定地说,无论你的蛮力方法和这种排列方法都不会很快耗尽它们!

披露:这个答案是基于gnovice的评论,这个评论值得扩展,用于上下文和链接。