如何在不使用for循环的情况下创建此矩阵?

时间:2015-09-16 08:09:59

标签: arrays matlab matrix vectorization

我想创建一个N * N矩阵A.

when n = 4
2  0 -2  0
2  0  2  0
0  2  0 -2
0  2  0  2

when n = 8
2  0  0  0 -2  0  0  0
2  0  0  0  2  0  0  0
0  2  0  0  0 -2  0  0
0  2  0  0  0  2  0  0
0  0  2  0  0  0 -2  0
0  0  2  0  0  0  2  0
0  0  0  2  0  0  0 -2
0  0  0  2  0  0  0  2

我可以使用嵌套for循环创建它,但如何更有效地实现它?有没有for循环的方法吗?

由于

2 个答案:

答案 0 :(得分:1)

这是bsxfun -

的一种方式
A = zeros(n);
idx = bsxfun(@plus,[0:(n/2)-1]*((n+3)-1),[1:2].');
A(idx) = 2;
A(idx+numel(A)/2) = -2;

样品运行 -

案例#1:

>> n = 4;
>> A
A =
     2     0    -2     0
     2     0    -2     0
     0     2     0    -2
     0     2     0    -2

案例#2:

>> n = 8;
>> A
A =
     2     0     0     0    -2     0     0     0
     2     0     0     0    -2     0     0     0
     0     2     0     0     0    -2     0     0
     0     2     0     0     0    -2     0     0
     0     0     2     0     0     0    -2     0
     0     0     2     0     0     0    -2     0
     0     0     0     2     0     0     0    -2
     0     0     0     2     0     0     0    -2

答案 1 :(得分:0)

你可以这样做:

[reshape([repmat([ 2;2;zeros(n,1)],n/2-1,1); 2;2],n,n/2)   ...
 reshape([repmat([-2;2;zeros(n,1)],n/2-1,1);-2;2],n,n/2) ]

如果n显然是2的幂,这只会起作用。

[编辑] 使用

可能会更快
[reshape([repmat([ 2;2;zeros(n,1)],n/2-1,1); 2;2;       ...
          repmat([-2;2;zeros(n,1)],n/2-1,1);-2;2] ,n,n) ]

[EDIT2] 如果您的n中等大小,这只是一个好主意。如果你需要非常大的矩阵,你应该使用稀疏矩阵。在这种情况下,循环就是你想要的。