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

标签 matlab matrix

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

我想用这种方式构造一个 m x 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 在第 3 个上对角线上交替出现。我希望能够使用 m x n 参数指定矩阵大小。

我过去常常使用 Mathematica 中的 SparseArrayBand 函数轻松完成此操作,但我在 Matlab 中找不到等效函数。有没有一种有效的方法可以在 Matlab 中构造这种矩阵?

最佳答案

您可以使用 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

构建起来效率有点低,但简单直接。

关于Matlab:创建具有重复值和交替值的带矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42730129/

相关文章:

c - 包括类型定义,但不包括函数

matlab - 为什么 Matlab 可以将空矩阵与单例矩阵进行比较?

algorithm - 在访问每个单元格一次后到达矩阵中的目的地

c++ - 在 C++ 中使用并行处理加速矩阵计算?

python - 如何有效地处理类似于 Matlab 的 blkproc (blockproc) 函数的 block 中的 numpy 数组

performance - 通过交错复制 3D 阵列的页面构建邻接矩阵

matlab - 如何在 MATLAB 中使用分组和堆叠样式创建条形图?

c++ - Matlab 的 imtransform 的 C/C++ 等效项?

javascript - 如何在 JavaScript 中用 undefined 填充锯齿状的多维数组?

java - 如何在不使用存储阵列的情况下将 2D 阵列旋转 90 度?