如何创建三角矩阵为1D
How to create a tri diagonal matrix as 1D
因此,对于我的应用程序,我需要创建一个对角矩阵。这很容易使用任何语言,您可以循环遍历所有行和列,然后设置主对角值,次对角线值和超对角线值。通常,这是在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
- 1d 智能指针不适用于语法 (*)++
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- 1d.exe找不到SFML文件?
- 1D中的非均匀FFT正向和反向测试
- 为什么将指针重新分配给 1D 数组的 char 时显示错误,但 2D 数组工作正常?
- 哪个更快:在 1d 向量中按字符串搜索还是在 2d 向量中按向量搜索?
- 多 GPU 批处理 1D FFT:似乎只有一个 GPU 可以工作
- 如何使用指针C++将元素从2D数组复制到1D数组
- 从 2 个 1D 矢量创建 2D 矢量
- fftw:为什么我的 2D DFT 输出与每行的 1D DFT 输出不同?
- 借助功能将 2D 转换为 1D 数组
- 使用片段着色器写入 1D 纹理后从 1D 纹理读回不起作用
- 三角化元组
- 为什么这个Pascal三角实现给了我尾随的零
- CGAL-三角网格,返回面对面映射
- 如何将1D阵列访问为2D阵列
- 使用C++将1D数组转换为2D字符串数组
- 如何访问CGAL三维三角测量中的面
- 如何创建三角矩阵为1D