【问题标题】:Creating specific big matrix in matlab在matlab中创建特定的大矩阵
【发布时间】:2013-04-02 23:39:45
【问题描述】:

我的问题是如何在 matlab 程序中创建相同类型的矩阵,使其保持相同的逻辑,即主对角线 10 秒,然后围绕主对角线的上下对角线 3 秒,以及在其他情况下,在 3s 和 0s 上方和下方的对角线中,我可以根据我想要的任何 NxN 进行修改?

类似这样的 6x6 案例

A = [10  3  1  0  0  0 ; 
      3 10  3  1  0  0 ;
      1  3 10  3  1  0 ; 
      0  1  3 10  3  1 ; 
      0  0  1  3 10  3 ;
      0  0  0  1  3 10 ];

【问题讨论】:

标签: matlab


【解决方案1】:

对于非常大的矩阵 (N=10000),您必须使用稀疏矩阵。
考虑以下使用spdiags的构造

function A = largeSparseMatrix( N )
%
% construct NxN sparse matrix with 10 on main diagonal, 
% 3 on the first off-diagonals and 1 on the second off-diagonals
%
B = ones(N, 5); % pre-allocate for diagonals
B(:,1) = 10;  % main diagonal d(1) = 0
B(:,2:3) = 3; % first off diagonal
B(:,4:5) = 1; % second off-diagonal
d = [ 0 , 1, -1, 2, -2 ]; % mapping columns of B to diagonals of A
A = spdiags( B, d, N, N ); % TA-DA!

请注意,B 中的某些条目在构造 A 时会被忽略。
有关详细信息,请参阅 spdiagsmanual

【讨论】:

  • 当我执行程序并增加 N 到 20 时,我无法得到一个 20x20 的矩阵,其中主对角线为 10,第一个非对角线为 3,第二个非对角线为 1 ,我做错了什么?
  • 我仔细检查了代码,似乎没有生成我想要的矩阵
  • @mpalmero - 我的错。我错过了spdiags 的两个论点。我编辑了我的答案,请再试一次。
  • 亲爱的Shai,输出仍然不准确。对我的问题有什么好处,一旦我实现你的代码并执行类似这样的 largeSparseMatrix(6),输出将是:A = [10 3 1 0 0 0; 3 10 3 1 0 0 ; 1 3 10 3 1 0 ; 0 1 3 10 3 1 ; 0 0 1 3 10 3 ; 0 0 0 1 3 10];如果我增加 N re 输出将是具有相同结构的任何 NxN 矩阵。非常感谢您对此的所有支持。
  • @mpalmero - 现在的输出(修复后)在什么意义上与您的预期不同?你熟悉全矩阵和稀疏矩阵的区别吗?
【解决方案2】:

代码:

toeplitz([10  3  1  0  0  0])

输出:

ans =

    10     3     1     0     0     0
     3    10     3     1     0     0
     1     3    10     3     1     0
     0     1     3    10     3     1
     0     0     1     3    10     3
     0     0     0     1     3    10

【讨论】:

  • 非常感谢,但如果想先使其成为 50x50 和 1000x1000,然后可能是 10000x10000,该怎么办
  • @mpalmero 老实说,您甚至不应该明确地形成 toeplitz,因为这会浪费内存;直接用矩阵做算术也是浪费触发器。您可以仅使用 3 个元素存储上面的示例矩阵。但是,如果您想明确地对其进行改革,最简单的方法是重用 toeplitz 函数并再次覆盖 A。如果它回答了您的问题,也不要忘记接受我的回复。
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2021-03-31
  • 2012-03-16
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多