我们说我有7个值: a,b,c,d,e,f 和 g
我想用这种方式构造一个m×n矩阵:
[ a b c d 0 0 0 0 . . . .
[ b e f g 0 0 0 0 . . . .
[ c f a b c d 0 0 . . . .
[ d g b e f g 0 0 . . . .
[ 0 0 c f a b c d 0 0 . .
[ 0 0 d g b e f g 0 0 . .
[ . . 0 0 c f a b c d . .
[ . . 0 0 d g b e f g . .
等等......
因此,所需的矩阵是对称的。主对角线上的值 a 和 e 交替显示;值 b 和 f 在第1个上对角线上交替显示;值 c 和 g 在第二个上对角线上交替显示;值 d 和 0 在第3个上对角线上交替显示。我希望能够用m乘n个参数指定矩阵大小。
我曾经使用Mathematica中的SparseArray
和Band
函数轻松完成此操作,但我在Matlab中找不到等效的函数。在Matlab中构建这种矩阵是否有效?
答案 0 :(得分:3)
您可以使用spdiags
指定稀疏矩阵中的上对角线,然后添加严格上三角形部分的转置以获得精确对称:
>> n = 6;
>> a = 1;b = 2;c = 3;d = 4;e = 5;f = 6;g = 7;
>> n = 6;
>> A = spdiags(repmat([[a;e] , [f;b] , [c;g] , [0;d]],n/2,1),0:3,n,n);
>> A = A + triu(A,1).';
>> issymmetric(A)
ans =
1
>> full(A)
ans =
1 2 3 4 0 0
2 5 6 7 0 0
3 6 1 2 3 4
4 7 2 5 6 7
0 0 3 6 1 2
0 0 4 7 2 5
您可能会注意到我翻了b
/ f
和0
/ d
来调整填充行为;可能有更好的方法来做到这一点。
对于具有潜在奇数维数的非方形矩阵,我将构建最小尺寸的方形稀疏矩阵,其中实际的矩阵作为子矩阵并在最后屏蔽掉不需要的部分:
>> m = 13;
>> n = 6;
>> p = max([m,n]);
>> p = p + mod(p,2); % added to make p even.
>> A = spdiags(repmat([[a;e] , [f;b] , [c;g] , [0;d]],p/2,1),0:3,p,p);
>> A = A + triu(A,1).';
>> A = A(1:m,1:n);
>> full(A)
ans =
1 2 3 4 0 0
2 5 6 7 0 0
3 6 1 2 3 4
4 7 2 5 6 7
0 0 3 6 1 2
0 0 4 7 2 5
0 0 0 0 3 6
0 0 0 0 4 7
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
构建起来效率低下,但简单直接。
答案 1 :(得分:2)
您可以使用spdiags功能
使用数字代替字母(稀疏不支持符号),如下所示:
m = 10;
n = 10;
B = repmat([1:4;[5:7 0]],n/2,1);
B=[B(:,end:-1:2) B];
d=-3:3;
A = spdiags(B,d,m,n);
full(A)
输出:
1 6 3 0 0 0 0 0 0 0
2 5 2 7 4 0 0 0 0 0
3 6 1 6 3 0 0 0 0 0
4 7 2 5 2 7 4 0 0 0
0 0 3 6 1 6 3 0 0 0
0 0 4 7 2 5 2 7 4 0
0 0 0 0 3 6 1 6 3 0
...
<强>解释强>
B矩阵包含其列中对角线所需的值。它首先使用B = repmat([1:4;[5:7 0]],n/2,1);
构造,使前两行重复n / 2次。那时它看起来像:
1 2 3 4
5 6 7 0
1 2 3 4
5 6 7 0
1 2 3 4
5 6 7 0
1 2 3 4
...
然后镜像使用B=[B(:,end:-1:2) B];
给它在对角线下部的对角线,使其看起来像:
4 3 2 1 2 3 4
0 7 6 5 6 7 0
4 3 2 1 2 3 4
0 7 6 5 6 7 0
4 3 2 1 2 3 4
0 7 6 5 6 7 0
4 3 2 1 2 3 4
...
这些是传递给spdiags
函数的对角线。
end
是一个MATLAB关键字,指的是最后一列或一行。索引行用文字表示:&#34;取B的所有行,从末尾开始的列,一次返回1步,直到第二列,并将该子矩阵放在B之前。&#34;这就是镜像的完成方式。