Разделение матрицы на подматрицы в Фортране - PullRequest
0 голосов
/ 24 июня 2018

Предположим, у меня есть двумерный массив, в котором первый столбец состоит только из двух целых чисел 1 и 2:

1 5 1 7 0.5                   
2 4 5 6 0.1       
1 9 3 4 0.6        
2 8 7 2 0.2  

Я хочу выделить из этого две матрицы, чтобы первый столбецкаждого из них содержит одно и то же целое число (поэтому первый столбец первой матрицы содержит только целое число 1, то же самое относится и к 2 во второй матрице).
Таким образом, это будет:

1 5 1 7 0.5
1 9 3 4 0.6  

и

2 4 5 6 0.1              
2 8 7 2 0.2 

Я не знаю точно, как начать.Я думал об использовании счетчика в начале (ну, потому что у меня намного большая матрица с 10 различными целыми числами в первом столбце), затем в соответствии с подсчитанным числом каждого целого числа я строю размерность каждой [под] матрицы.После этого я могу думать только о количестве (маске), и, если значение равно true, оно добавляется в матрицу с помощью оператора if.

1 Ответ

0 голосов
/ 25 июня 2018

Вы не можете иметь смешанные типы (integer и real) в одном и том же массиве в Фортране, поэтому я предполагаю, что все данные real в 2-мерном массиве:

program split
  implicit none

  real, allocatable :: a(:, :), b(:, :)
  integer :: i, ids = 10
  integer, allocatable :: id(:), seq(:)

  a = reshape([real :: 1, 5, 1, 7, 0.5, &
                     & 2, 4, 5, 6, 0.1, &
                     & 1, 9, 3, 4, 0.6, &
                     & 2, 8, 7, 2, 0.2], [5, 4])
  seq = [(i, i = 1, size(a, 2))]
  do i = 1, ids
    print*, "i = ", i
    ! here we are creating a vector with all the line indices that start with i
    ! e.g. for i = 1 we get id = [1, 3], for i = 2 we get [2, 4], for i = 3 we get [], ...
    id =  pack(seq, a(1,:) == i)
    ! here we use a Fortran feature named vector-subscript
    b = a(:, id)
    print*, b
  end do
end

Если вы хотите, чтобы первый столбец (или любой столбец) был integer, вы можете объявить его как отдельный массив и использовать те же векторные индексы, чтобы собрать нужные строки.

...