質問

Fortranでは、配列で動作できますが、配列の一部として派生タイプのインデックスをどのように処理できますか?コードは私が最善を尽くしたいことを説明します:

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は不満を言います

エラー:ゼロ以外のランクを持つ2つ以上の部品参照を指定してはなりません

これはFortranで行うことができますか?

役に立ちましたか?

解決

コンパイラに検討してもらいたいです mat(:)%c 2 x 4マトリックスとして?そのように機能しません。 matc 異なるオブジェクトであり、そのランクは単一の配列に融合しません。 mat ユーザー定義のタイプと c 本物のマトリックスです。あなたがだけを使用しているからです c- のコンポーネント mat コンパイラが宣伝するという意味ではありません c の次元に基づいて、より高い次元の実際の配列に mat.

介して新しい配列を作成できます X = [ mat(1)%c, mat(2)%c ]. 。使用できます reshape 形状を制御します。

他のヒント

Nonsquareマトリックスを単独で掛けることはできません。そのうちの1つを転置する必要があります。

また、リアルと整数を混ぜます。マトリックスは本物であると想定されており、結果は整数です。

マトリックスを小さなFortranスタイルのハック(等価性とシーケンス、デフォルトの整数とREALの同じストレージサイズを想定して)で参照することができます。これはコンパイル:))))

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