Matlab:创建具有重复和交替值的带矩阵

时间:2017-03-11 01:00:42

标签: matlab matrix

我们说我有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中的SparseArrayBand函数轻松完成此操作,但我在Matlab中找不到等效的函数。在Matlab中构建这种矩阵是否有效?

2 个答案:

答案 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 / f0 / 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;这就是镜像的完成方式。