如何创建三角矩阵为1D

How to create a tri diagonal matrix as 1D

本文关键字:1D 三角 何创建 创建      更新时间:2023-10-16

因此,对于我的应用程序,我需要创建一个对角矩阵。这很容易使用任何语言,您可以循环遍历所有行和列,然后设置主对角值,次对角线值和超对角线值。通常,这是在2D阵列上执行的。

对于我的应用程序,我需要创建一个" Tridiagonal"的一维数组。相反,这样说是:取2D Tridiagonal矩阵,然后将其变成1D。我可以从2D开始,然后编写一些将2D数组转换为1D数组的功能。我可以做。我想知道我们是否直接进入1D" Tridiagonal"?例如,假设2D数组为10*10,那么我的1D数组将长100个元素,然后我需要找出哪个索引是主要的,超级和子对角线。

有可能这样做吗?请让我知道,谢谢

主角对角线上的元素在索引(i,i),其中有n;(i,i-1)和(i,i 1)的上角和对角线,其中有N-1(分别为2分,分别以N-1结束)。

一个选项是使用三个向量并将元素存储在各个索引i中i在这三个向量中。

您还可以将所有值包装在长度为3N的单个向量中(如果要备用空间,则可以将所有值包装在3N-2的长度上)。根据要解决的对角线,将N或2N添加到索引中。对于元素(i,j),对角线的索引由J-I 2。

给出

您可以使用2D数组指针查看您的1D数组。fortran:

  integer, target :: A(100)
  integer, pointer :: B(:,:)
  B(1:10,1:10) => A
  B = 0
  do i = 1, 10
    B(i,i) = 1
  end do
  print '(*(1x,g0))', A
end

> gfortran diag1d.f90 
> ./a.out 
 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1

在C 中,铸件也很容易。

请考虑:

  • @yvesdaoust的答案,因为提出了一个更好的存储策略:而不是存储tridiagonal矩阵的所有元素,而只是存储非零。您可以编写派生类型以封装行为,如果值得。

  • @vladmirf的答案,因为指针关联可能是一种更好的方法(取决于您的用例),而不是通过reshape复制所有数组,如果您想要的只是为了方便数据而暂时索引更改,则。

说,让我们回答我的回答。

  • 填充三角形矩阵与构建任何矩阵没有什么不同。我认为这里真的没关系。只需记住,Fortran以列列表的存储阵列,1个基于1个索引。

  • 如果存储是毫无用处的,则更改数据形状是简单而明显的。您可以与reshape进行pointer关联或将其传输到新变量。

  • 提取主,超级和子对角线也是一个微不足道的问题,可以通过简单地操纵阵列索引三重态来完成。看:

    program tridiagonal
      implicit none
      integer, parameter :: n = 4
      integer :: A(n, n), B(n**2), main(n), sub(n-1), sup(n-1)
      A(1,:) = [1, 4, 0, 0]
      A(2,:) = [3, 4, 1, 0]
      A(3,:) = [0, 2, 3, 4]
      A(4,:) = [0, 0, 1, 3]
                                ! Remember, colum major
      B = reshape(A, shape(B))  ! 1, 3, 0, 0, 4, 4, 2, 0, 0, 1, 3, 1, 0, 0, 4, 3
      main = B(  1:n**2:n+1)    ! 1, 4, 3, 3
      sub  = B(  2:n**2:n+1)    ! 3, 2, 1
      sup  = B(n+1:n**2:n+1)    ! 4, 1, 4
    end