有人能告诉我使用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];
}
}
由于
答案 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();
}
我不知道这可能提供什么,如果有的话,性能提升。您需要对其进行分析才能找到答案。
祝你好运。