Вопрос

В Фортране можно работать на массивах, но как можно относиться к показателям производного типа как часть массива? Код объяснит, что я хочу сделать лучше всего:

type mytype
    integer :: b(3,3)
    real :: c(4)
endtype

integer :: a(3,3)
real :: d(2,4)
type(mytype) :: mat(2)

!do stuff so that 'mat' gets values
....

!usually one does this
a = matmul(mat(1)%b, transpose(mat(2)%b))

!multiplying two 3x3 matrices

!but how does one do this? Note the "array"
d = matmul(mat(:)%c, mat(:)%c)

Я предположил, что окончательная линия аналогична матрице 2x4, умноженной на себя. Однако, когда я пытаюсь скомпилироваться, Gfortran жалуется

Ошибка: две или более ссылок на части с ненулевым рангом не должны быть указаны

Можно ли это сделать в Фортране?

Это было полезно?

Решение

Вы хотите, чтобы компилятор рассказал mat(:)%c как матрица 2 x 4? Это не работает так. mat а также c разные объекты, а их ряды не сливаются в единый массив. mat является определенным пользователем типом и c настоящая матрица. Просто потому, что вы используете только c-Копонент mat не означает, что компилятор будет продвигать c на более высокий размерный массив, основанный на измерении mat.

Вы можете создать новый массив через X = [ mat(1)%c, mat(2)%c ]. Анкет Вы могли бы использовать reshape контролировать форму.

Другие советы

Вы не можете умножить без квадрат матрицы сами по себе. Вы должны перенести один из них.

Вы также смешиваете реальные и целые числа. Ваши матрицы должны быть реальными, и ваш результат целый ряд.

Можно ссылаться на матрицу небольшим взломом в стиле Фортрана (эквивалентность и последовательность, предполагая тот же размер хранения для целочисленного и реального). Этот компилирован :))))))

type mytype
    !!!
    sequence
    integer :: b(3,3)
    real :: c(4)
endtype

integer :: a(3,3)
real :: d(4,4)

type(mytype) :: mat(2)
real,dimension(13,2) :: newmat

!!!
equivalence (mat,newmat)

!do stuff so that 'mat' gets values
! ....

!usually one does this
a = matmul(mat(1)%b, mat(2)%b)

!multiplying two 3x3 matrices

!but how does one do this? Note the "array"
 d = matmul(reshape(newmat(10:13,:),(/4,2/)),transpose(reshape(newmat(10:13,:),(/4,2/))))

end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top