如果我理解你的问题,你想要:
- 增加数量
n
矩阵的列数m
by 1;
- 插入向量的内容
b
in m
作为新列,位于索引处col
;
- 右移其余列
m
,以免丢失任何数据。
在这种情况下,您将需要一些东西:
- matrix
m
必须是allocatable
如果你想在本地更新数据。如果您想返回一个新的独立数组作为结果,则不需要这样做(但会创建额外的数据副本)。
- 最好使用至少符合 2003 标准的编译器,这样您就可以访问内在的
move_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
我的输出与gfortran 7.1.1 is:
10 1 10 10
10 2 10 10
10 3 10 10