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

除了我看到的两个错误之外,您所拥有的将起作用,但它也可以稍微快一点。首先是错误。您的循环应该测试 NumSamplesIJK.J 而不是 .I 用于外部循环和 .K,而不是 .J 用于内部循环。对于 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++)
   ...

您也可以考虑使用 Traces 枚举器而不是调用 GetTrace。它将按跟踪升序处理数据。不幸的是,三行代码有点难以阅读。

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 回答