我想知道如何按以下顺序创建矩阵n x n
,例如
n=3;
1 -1 1
-1 1 -1
1 -1 1
n=4;
1 -1 1 -1
-1 1 -1 1
1 -1 1 -1
-1 1 -1 1
表示每个号码n
。
答案 0 :(得分:5)
另一种方法是产生meshgrid
个点,然后计算:
(-1)^(x+y) ,
其中x
和y
是网格内的2D坐标位置。这种方法背后的主要直觉是当你取-1并将其加到奇数时,你返回-1,如果它是偶数,它就是+1。通过查看2D网格中的每个位置,当您将(x,y)
坐标加在一起时奇偶校验(奇数/偶数)在奇数和偶数之间交替...当然假设整数坐标。您可以通过获取每个(x,y)
位置的总和,并将其应用于功率系数,以-1为基础来实现我们想要的交替矩阵,从而利用这一点。
通过考虑如何计算矩阵的行列式,我对这种方法有所启发。查看拉普拉斯关于计算行列式的公式:http://en.wikipedia.org/wiki/Determinant#Laplace.27s_formula_and_the_adjugate_matrix
因此:
n = 3; %// Define n here
[X,Y] = meshgrid(1:n, 1:n);
A = (-1).^(X+Y)
A =
1 -1 1
-1 1 -1
1 -1 1
如果您想为n = 4
显示此内容:
A =
1 -1 1 -1
-1 1 -1 1
1 -1 1 -1
-1 1 -1 1
答案 1 :(得分:4)
方法#1
>> n = 4;
>> 1-2*mod(bsxfun(@plus,[1:n]',1:n),2)
ans =
1 -1 1 -1
-1 1 -1 1
1 -1 1 -1
-1 1 -1 1
方法#2
这是来自Ray's solution -
的黑客攻击>> n = 4;
>> (-1).^bsxfun(@plus,[1:n]',1:n)
答案 2 :(得分:4)
toeplitz
适用于此:
>> n=3;
>> hrow = ones(1,n); hrow(2:2:end)=-1;
>> A = toeplitz(hrow)
A =
1 -1 1
-1 1 -1
1 -1 1
>> n=4; hrow = ones(1,n); hrow(2:2:end)=-1;
>> A = toeplitz(hrow)
A =
1 -1 1 -1
-1 1 -1 1
1 -1 1 -1
-1 1 -1 1
Nemesis在The link向OP提出的his comment归结为:
p = mod(1:n, 2);
A = 1-2*bsxfun(@xor, p.', p)
那也很好,对于大n
来说要快得多。
答案 3 :(得分:4)
此解决方案不涉及算术运算:
A = ones(n);
A(1:2:end, 2:2:end) = -1;
A(2:2:end, 1:2:end) = -1;
答案 4 :(得分:3)
cos((0:n-1)*pi)'*cos((0:n-1)*pi)
答案 5 :(得分:1)
除了所有解决方案,还有两个解决方案。
一个与向量乘法有关:
p = 1-2*mod(1:n,2);
A = p.'*p;
第二个是使用Kronecker产品,但是(唉)只有在输出大小均匀的情况下:
A = kron(ones(n/2), [1 -1;-1 1]);