gpt4 book ai didi

c# - 3D 数组切片中的最小值和最大值

转载 作者:太空宇宙 更新时间:2023-11-03 21:56:03 25 4
gpt4 key购买 nike

我有一个 3 维数组 double[,,] numbers = new double[x,y,z]; 现在如果有人想象 3 维数组看起来像一个带有数字的立方体需要找到沿所有三个方向的每个切片的最小值和最大值。

这当然很容易通过简单地遍历它来实现,但是 C# 是否有任何函数来查找切片中的最小值和最大值?

进一步解释一下,也许这段“虚幻”代码会有所帮助:

int i;

double[] xmin = new double[x];
double[] xmax = new double[x];
double[] ymin = new double[y];
double[] ymax = new double[y];
double[] zmin = new double[z];
double[] zmax = new double[z];

for(i = 0; i < x; i++)
{
MinOf(numbers[i, y, z]) = xmin[i];
MaxOf(numbers[i, y, z]) = xmax[i];
}

for(i = 0; i < y; i++)
{
MinOf(numbers[x, i, z]) = ymin[i];
MaxOf(numbers[x, i, z]) = ymax[i];
}

for(i = 0; i < z; i++)
{
MinOf(numbers[x, y, i]) = zmin[i];
MaxOf(numbers[x, y, i]) = zmax[i];
}

希望有人能帮助我。干杯,Phil13131

最佳答案

您可以创建枚举切片的方法。这是一个维度,您还需要另外两个维度,但我认为您可以做到:

public static IEnumerable<T> SliceX<T>(T[,,] data, int x) {
for (int y = 0; y < data.GetLength(1); y++) {
for (int z = 0; z < data.GetLength(2); z++) {
yield return data[x, y, z];
}
}
}

然后您可以只使用 MinMax 方法,但这当然会循环遍历数据两次:

double min = SliceX(numbers, x).Min();
double max = SliceX(numbers, x).Max();

您可以创建一个在一次迭代中同时获取最小值和最大值的扩展方法:

public static class IEnumerableExtensions {

public static void GetMinMax<T>(this IEnumerable<T> data, out T min, out T max) where T : IComparable<T> {
bool first = true;
min = max = default(T);
foreach (T value in data) {
if (first) {
min = max = value;
first = false;
} else {
if (value.CompareTo(min) < 0) min = value;
if (value.CompareTo(max) > 0) max = value;
}
}
}

}

用法:

double min, max;
SliceX(numbers, 0).GetMinMax(out min, out max);

关于c# - 3D 数组切片中的最小值和最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12237801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com