Matrix 将向量插入特定列的矩阵中

Matrix 将向量插入特定列的矩阵中,matrix,fortran,gfortran,Matrix,Fortran,Gfortran,如何在列col处将向量b插入矩阵?我在Fortran中找不到and insert或append函数的任何语法 到目前为止,我所做的只是重新分配列中的值,但我只想插入向量 real :: M(n,n) integer :: n, col real :: b(n) M(n:col) = b(:) 如果我了解你的问题,你想: 将矩阵m的列数n增加1 在索引col处,将向量b的内容作为新列插入m中 将m的其余列右移,以免丢失任何数据 在这种情况下,您需要做几件事: 如果要在本地更新数据,矩阵m

如何在列col处将向量b插入矩阵?我在Fortran中找不到and insert或append函数的任何语法

到目前为止,我所做的只是重新分配列中的值,但我只想插入向量

real :: M(n,n)
integer :: n, col 
real :: b(n)
M(n:col) = b(:)

如果我了解你的问题,你想:

  • 将矩阵
    m
    的列数
    n
    增加1
  • 在索引
    col
    处,将向量
    b
    的内容作为新列插入
    m
  • m
    的其余列右移,以免丢失任何数据
在这种情况下,您需要做几件事:

  • 如果要在本地更新数据,矩阵
    m
    必须是
    可分配的
    。如果您希望返回一个新的独立数组,则无需执行此操作(但会创建一个额外的数据副本)
  • 最好使用至少符合2003标准的编译器,这样您就可以访问内在的
    move\u alloc
    ,从而避免在重维度中复制一个数组
下面是一个演示实现:

program insert_vec
  integer, allocatable :: m(:, :), b(:)
  integer :: n = 3, col = 2, i
  allocate(m(n, n))
  allocate(b(n))
  m = 10
  b = [(i, i = 1, n)]
  call insert(m, b, col)
  do i = 1, n
      print *, m(i, :)
  end do
contains
  subroutine insert(m, b, col)
    integer, allocatable, intent(inout) :: m(:, :)
    integer, intent(in) :: b(size(m, 1)), col
    integer, allocatable :: temp(:, :)
    integer :: rows, cols
    rows = size(m, 1)
    cols = size(m, 2)
    allocate(temp(rows, cols + 1))
    temp(:, 1:col) = m(:, 1:col)
    temp(:, col) = b
    temp(:, col + 1:cols + 1) = m(:, col:cols)
    call move_alloc(temp, m)
  end
end
我的输出是:


因此,当我正确理解它时,您希望在矩阵
M
中插入向量
b
,其中
M
的大小为
nxn
,而
b
的大小为
n
。假设n@albert,我猜OP试图将矩阵M的一维增加1,然后在具有索引col的列上插入向量b,将所有列从索引col,…,n右移到col+1,…,n+1,为b腾出空间。是吗?@RodrigoRodrigues可能是这样,但我对这个问题不是100%清楚。在这种情况下,我们需要知道OP是如何声明
M
矩阵的,OP请提供详细信息,阅读并提供一个。
      10           1          10          10
      10           2          10          10
      10           3          10          10