11

最新のFortranで、ベクトルを使用して多次元配列にインデックスを付けることは可能ですか?つまり、与えられた、例えば、

integer, dimension(3) :: index = [4,6,9]
double precision, dimension(10,10,10) :: data

data(4,6,9)書くよりも良い(より一般的な)アクセス方法はありますdata(index(1), index(2), index(3))か?data配列のランクをハードコーディングする必要がないのは良いことです。

(素朴に書きたいのですdata(index)が、もちろんこれは実際には別の何かを意味します-サブセットの「収集」-dataランク1の配列自体である必要があります。)

これは本質的に、JavaScriptのインデックスの配列による多次元インデックスと同じ質問ですが、代わりにFortranにあります。残念ながら、そこにある巧妙な答えは、事前定義された配列ランクでは機能しません。

4

1 に答える 1

11

いいえ。私が考えることができるすべての回避策は、ひどいハックです。引数として、必要な要素を吐き出す関数を作成することdataをお勧めします。index

ただし、配列ランクの再マッピングに最新のFortranの機能を使用して、正反対のことを行うことができる場合があります。これにより、配列ランクをすばやく緩くしたいという要望を満たすことができます。

宣言が与えられた

double precision, dimension(1000), target :: data

ランク3のポインターを定義できます

double precision, pointer :: index_3d(:,:,:)

次に、次のように設定します。

index_3d(1:10,1:10,1:10) => data

そして、ちょっとプレスト、これでランク3とランク1の両方のインデックスをに使用できるdataようになりました。これはあなたがやりたいことに近いものです。私はまだこれを怒りで使用していませんが、いくつかの簡単なテストでは深刻な問題は明らかになりませんでした。

于 2012-08-17T15:24:19.973 に答える