0

Ocean を使用して 2D 地震データにアクセスするための最も効率的/パフォーマンスの高い方法を誰か教えてもらえますか?

たとえば、3x2D 測線 (すべて同じ形状) のデータを使用して計算を実行する必要がある場合、これが最も効率的な方法ですか?

for (int j = 0; j < seismicLine1.NumSamplesJK.I; j++)
{
  ITrace trace1 = seismicLine1.GetTrace(j);
  ITrace trace2 = seismicLine2.GetTrace(j);
  ITrace trace3 = seismicLine3.GetTrace(j);

  for (int k = 0; k < seismicLine1.NumSamplesJK.J; k++)
  {
    double sum = trace1[k] + trace2[k] + trace3[k];
  }
}

ありがとう

4

2 に答える 2

2

@Keithの提案のフォローアップ-.NET4を使用すると、彼のコードをジェネリックにリファクタリングできます。

public static IEnumerable<Tuple<T1, T2, T3>> TuplesFrom<T1,T2,T3>(IEnumerable<T1> s1, IEnumerable<T2> s2, IEnumerable<T3> s3)
{
  bool m1, m2, m3; // "more" flags
  using (var e1 = s1.GetEnumerator())
  using (var e2 = s2.GetEnumerator())
  using (var e3 = s3.GetEnumerator())
    while ((m1 = e1.MoveNext()) && 
           (m2 = e2.MoveNext()) && 
           (m3 = e3.MoveNext()))
      yield return Tuple.Create(e1.Current, e2.Current, e3.Current);
  if (m1 || m2 || m3)
    throw new ArgumentException(); // sequences of unequal lengths
}

これは次のようになります。

foreach (var traceTuple in TuplesFrom(seismicLine1.Traces, seismicLine2.Traces, seismicLine3.Traces))
  for (int k = 0; k < maxK; ++k)
    sum = traceTuple.Item1[k] + traceTuple.Item2[k] + traceTuple.Item3[k];
于 2012-09-13T08:26:29.987 に答える
1

あなたが持っているものは、私が見た2つのバグを除いて機能しますが、少し速くすることもできます. まずバグ。ループは、外側のループに対して .I ではなく NumSamplesIJK.J をテストし、内側のループに対して .J ではなく .K をテストする必要があります。2D ラインの場合、.I は常に 0 です。

NumSamplesIJK プロパティの逆参照を最小限に抑えることで、パフォーマンスをわずかに向上させることができます。ジオメトリは同じなので、J プロパティと K プロパティの変数のペアを作成して使用する必要があります。

int maxJ = seismicLine1.NumSamplesIJK.J;
int maxK = seismicLine1.NumsamplesIJK.K;
for (int j = 0; j < maxJ; j++)
   ...
   for (int k = 0; k < maxK; k++)
   ...

GetTrace を呼び出す代わりに、Traces 列挙子を使用することも検討してください。トレースの昇順でデータを処理します。残念ながら、コードが 3 行になると、コードが少し読みにくくなります。

int maxK = SeismicLine1.NumSamplesIJK.K;
IEnumerator line2Traces = seismicLine2.Traces.GetEnumerator();
ITrace line2Trace = line2Traces.MoveNext();
IEnumerator line3Traces = seismicLine3.Traces.GetEnumerator();
ITrace line3Trace = line3Traces.MoveNext();
foreach (ITrace line1Trace in seismicLine1.Traces)
{
    for (int k = 0; k < maxK; k++)
    {
        double sum = line1Trace[k] + line2Trace[k] + line3Trace[k];

    }
    line2Trace = line2Traces.MoveNext();
    line3Trace = line3Traces.MoveNext();
}

これによりパフォーマンスが向上するかどうかはわかりません。調べるには、プロファイルを作成する必要があります。

幸運を。

于 2012-09-06T11:47:30.503 に答える