Транспозиция ранга 1 в Fortran-95 - ошибка рекурсивной операции ввода-вывода

Я пытаюсь написать функцию, которая принимает матрицу ранга 1 (вектор-строку) и выводит вектор-столбец, поскольку встроенный TRANSPOSE() не принимает матрицы ранга 1. Когда я вызываю следующую функцию, используя вектор-строку A = [1 2 3], я получаю:

forrtl: severe (40): recursive I/O operation, unit -1, file unknown

в окне вывода программы.

! Below is the code in the main program that ends up calling rowToColumnVec

REAL, DIMENSION(1:3,1) :: A, B, C ! Define 3 column vectors
INTEGER                :: length

length = SIZE(A, DIM = 1)
CALL oneDimInput(A, length)
CALL oneDimInput(B, length)

WRITE(*,*) "A = ", A 
READ(*,*) 

WRITE(*,*) "A transpose is ", rowToColumnVec(A)
READ(*,*)

! Below is code that exists in a separate .f90 file that is used by the main 
! program. I know that the main program has no problem running other 
! functions and subroutines from this .f90 file.

    FUNCTION rowToColumnVec(A)
        IMPLICIT NONE

        REAL, DIMENSION(1,1:3), INTENT(IN) :: A
        REAL, DIMENSION(1:3,1)             :: B
        REAL, DIMENSION(1:3,1)             :: rowToColumnVec

        B(1,1) = A(1,1)
        B(2,1) = A(1,2)
        B(3,1) = A(1,3)

        rowToColumnVec(1,1) = B(1,1)
        rowToColumnVec(2,1) = B(2,1)
        rowToColumnVec(3,1) = B(3,1)

        WRITE(*,*) "Shape B: ", SHAPE(B)
        READ(*,*) 

    END FUNCTION rowToColumnVec

Что происходит не так?

Кроме того, есть ли другая встроенная функция для транспонирования матрицы ранга 1?

Редактировать: добавлен код в основную программу, которая вызывает функцию.


person Unique Worldline    schedule 07.06.2017    source источник
comment
Если у вас есть write(*,*) rowToColumnVec(x), вы действительно ожидаете так называемый рекурсивный ввод-вывод. См. этот ответ, чтобы узнать, как с этим справиться.   -  person francescalus    schedule 07.06.2017
comment
Я думаю, что это сделал @fracescalus   -  person Unique Worldline    schedule 07.06.2017
comment
@ High Performance Mark, можете ли вы пояснить, почему fortran не любит различать векторы строк и столбцов? По сути, мне нужны все возможности MATLAB по работе с матрицами (сложение, вычитание, умножение, транспозиция, скалярное произведение, перекрестное произведение и т. д.), но в Фортране, и мне нужно иметь возможность выполнять эти операции над векторами строк/столбцов. Так как умножение [1 2 3] * [1; 2; 3] против [1; 2; 3] * [1 2 3] очень разные, как я могу справиться с этим в Фортране?   -  person Unique Worldline    schedule 07.06.2017
comment
@HighPerformanceMark, откуда у тебя неприязнь? Поскольку в матричной алгебре диадические произведения и скалярные произведения очень разные, кажется, что различие строк и столбцов должно быть реализовано полезным способом. Я только начал изучать ФОРТРАН два дня назад, так что я мало что знаю, но такое различие кажется логичным.   -  person Unique Worldline    schedule 07.06.2017
comment
Давайте не будем продолжать эту дискуссию в чате. Я выражаю мнение, а SO не очень ценит мнения. Тоже совершенно верно.   -  person High Performance Mark    schedule 07.06.2017
comment
@UniqueWorldline FWIW, есть встроенная функция transpose() (которая, похоже, делает то же самое, что и rowToColumnVec()). Если вы создаете векторы столбцов и строк с массивами ранга 2, я думаю, что matmul(v, transpose(v)) и т. д. работает, как и ожидалось. С другой стороны, если эти векторы заданы как массивы ранга 1, нет различия между векторами-столбцами и векторами-строками (т. ) правильно обрабатывать 'u' в зависимости от контекста (столбца и строки соответственно).   -  person roygvib    schedule 08.06.2017
comment
@UniqueWorldline Бесполезно думать о массивах Fortran как о векторах и матрицах. Векторы и матрицы — это объекты линейной алгебры с точными значениями. Массивы Fortran — это просто структурированные наборы значений, не более того. Одномерные массивы Fortran НЕ являются векторами, это просто числа с индексами (lbound:ubound). Вы можете использовать их как матрицы и векторы в matmul(), dot_product() и подобных функциях, но нет различий между строками и столбцами.   -  person Vladimir F    schedule 08.06.2017
comment
@roygvib и Владимир Ф, спасибо вам обоим за ваши комментарии. Поскольку я продолжаю выяснять, сколько функций матричной алгебры существует во встроенных библиотеках, я буду помнить об этом.   -  person Unique Worldline    schedule 08.06.2017