Если я понял вашу проблему, вы хотите:
- увеличить число
n
столбцов матрицы m
на 1; - вставить содержимоевектор
b
в m
в качестве нового столбца, с индексом col
; - сдвиньте вправо оставшиеся столбцы
m
, чтобы не потерять данные.
В этом случае вам понадобится пара вещей:
- matrix
m
должно быть allocatable
, если вы хотите обновить данные локально.Если вы хотите вернуть новый независимый массив в результате, в этом нет необходимости (но будет сделана дополнительная копия данных). - лучше использовать компилятор, по крайней мере совместимый со стандартом 2003, чтобы у вас был доступ к
move_alloc
, которые избегают одной копии массива в redimension.
Вот демонстрационная реализация:
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 это:
10 1 10 10
10 2 10 10
10 3 10 10