Matlab:使用重复和交替值创建频带矩阵
假设我有7个值:a,b,c,d,e,f和g 我想用这种方法构造一个m×n矩阵:Matlab:使用重复和交替值创建频带矩阵,matlab,matrix,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 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在第一条上对角线上交替出现;值c和g在第二条上对角线上交替出现;值d和0在第三条上对角线上交替出现。我希望能够用m×n参数指定矩阵大小
我过去常常使用Mathematica中的SparseArray
和Band
函数轻松实现这一点,但在Matlab中找不到等效函数。在Matlab中有没有一种有效的方法来构造这种矩阵 您可以使用指定稀疏矩阵中的上对角线,然后添加严格上三角形部分的转置以实现精确对称:
>> 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
它的构建效率有点低,但是简单明了。您可以使用该函数
使用数字代替字母(稀疏不支持符号),如下所示:
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:70]],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关键字。该索引行用文字表示:“将B的所有行和列从末尾开始,一次返回一步,直到第二列,并将子矩阵放在B之前。”这就是镜像的实现方式。这非常有效,但仅适用于平方矩阵,如何修改代码以获得m×n矩阵?请参阅我的附录,@jrojasqu。我不知道你选择的号码来自哪里。您在矩阵B中使用end
,而矩阵B之前没有初始化,这是如何工作的?@jrojasqu我想在复制粘贴过程中跳过了一行。我已经修正了它,并添加了更多的解释。希望现在天气转晴。