Вставить вектор в матрицу в определенных столбцах - PullRequest
0 голосов
/ 29 сентября 2018

Как бы я вставил вектор b в матрицу в столбце col?Я не могу найти никакого синтаксиса для и вставить или добавить функцию в Fortran.

Пока все, что я сделал, это переназначил значения в столбце, но я только хочу вставить вектор.

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

1 Ответ

0 голосов
/ 30 сентября 2018

Если я понял вашу проблему, вы хотите:

  • увеличить число 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
...