我在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)
中的值,以确定ITH行中是否已经存在[1,...,n]
的值,然后从
[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。我正在尝试设计一种自动化的方法来完成具有一些值的部分拉丁正方形。
您描述的方法不足以每次生成拉丁正方形。例如,想象一下我们正在计算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));
请注意,这不会产生所有可能的拉丁正方形,因为:
" 如果可以通过置换行,列和符号从另一个方面获得两个正方形,则在同一同位素类别中 在上课之间跳跃将是另一个级别。n = 8的班级有超过100万个类,而较高值的类数迅速爆炸!wikipedia 以来有9,982,437,658,213,039,871,725,725,064,756,756,920,320,320,000 n = 10 的拉丁平方(在您尝试的情况下,就像您尝试的那样(,我认为您既不会说您的野蛮力量也不会很快地用途!> 披露:此答案是基于Gnovice的评论,值得扩大上下文和链接。