什么是访问二维地震数据的最有效方法

时间:2012-09-05 10:01:09

标签: ocean

有人能告诉我使用Ocean访问二维地震数据的最有效/最佳方法吗?

例如,如果我需要使用来自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];
  }
}

由于

2 个答案:

答案 0 :(得分:2)

跟随@Kith的建议 - 使用.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];

答案 1 :(得分: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。它将按跟踪升序处理数据。 Unfortunatley有三行代码有点难以阅读。

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();
}

我不知道这可能提供什么,如果有的话,性能提升。您需要对其进行分析才能找到答案。

祝你好运。