0

次の最小限の例があります。

      program main

      double precision, dimension(3)   :: rankone
      double precision, dimension(3,1) :: ranktwo

      double precision, dimension(3)   :: output

      rankone = 1
      ranktwo = 2

      output = rankone + ranktwo

      print *, 'output: ', output

      end program main

squeeze変数からシングルトン次元を削除するMatlabのような関数はありますかranktwo? 私は次のようなものを探しています

      output = rankone + squeeze(ranktwo)

そうでない場合、この設定の回避策はありますか?

この問題に関して、Fortran のさまざまなバージョン間に違いはありますか?

4

2 に答える 2

3

これを試して

output = rankone + reshape(ranktwo,[3])

次に、ドキュメントをreshape見て、何が起こっているかを確認してください。あなたも書くことができます

output = rankone + ranktwo(:,1)

から 1D 配列をスライスしranktwoます。私の経験reshapeでは、通常、配列のコピーが発生するため、2 番目のバージョンを優先するためのメモリ使用効率の議論があるかもしれません。

いいえ、この問題に関して Fortran のバージョン間に違いはありません。3x1 配列は長さ 3 の 1D 配列と同じ形状ではありません。

于 2013-01-27T13:39:51.727 に答える
1

あるいは、F2003 では、次のように、ランク 2 ポインターを使用してランク 1 配列を指すことができます。

program main

  double precision, dimension(3), target   :: rankone
  double precision, dimension(3,1) :: ranktwo
  double precision, dimension(3,1)   :: output
  double precision, pointer :: pp(:,:)

  rankone(:) = 1
  ranktwo(:,:) = 2
  pp(1:size(rankone),1:1) => rankone

  output = pp + ranktwo

  print *, 'output: ', output

end program main

もう一方の方向 (ランク 1 のポインターでランク 2 の配列を指す) は、私の記憶が正しければ、Fortran 2008 でのみ機能します。

于 2013-01-28T10:52:26.170 に答える