Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:使用重复和交替值创建频带矩阵_Matlab_Matrix - Fatal编程技术网

Matlab:使用重复和交替值创建频带矩阵

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 . . 等

假设我有7个值:a,b,c,d,e,fg

我想用这种方法构造一个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 . .
等等

因此,所需矩阵是对称的。值ae在主对角线上交替;值bf在第一条上对角线上交替出现;值cg在第二条上对角线上交替出现;值d0在第三条上对角线上交替出现。我希望能够用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我想在复制粘贴过程中跳过了一行。我已经修正了它,并添加了更多的解释。希望现在天气转晴。