1

私は 3D 配列を持っていますが、3D 配列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];
}

うまくいけば、誰かが私を助けてくれます。乾杯、フィル13131

4

2 に答える 2

2

スライスを列挙するメソッドを作成できます。これは 1 つのディメンション用です。さらに 2 つのディメンションが必要ですが、それを管理できると思います。

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];
    }
  }
}

Minその後、メソッドとメソッドを使用できますがMax、もちろん、データを 2 回ループします。

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

1 回の反復で最小値と最大値の両方を取得する拡張メソッドを作成できます。

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);
于 2012-09-02T17:00:18.280 に答える
2

このようなものをお探しですか?

double[, ,] numbers = new double[2, 2, 2];

numbers[0, 0, 0] = 0;
numbers[0, 0, 1] = 1;
numbers[0, 1, 0] = 2;
numbers[0, 1, 1] = 3;
numbers[1, 0, 0] = 4;
numbers[1, 0, 1] = 5;
numbers[1, 1, 0] = 6;
numbers[1, 1, 1] = 7;

double[] xmax = new double[numbers.GetLength(0)];
double[] ymax = new double[numbers.GetLength(1)];
double[] zmax = new double[numbers.GetLength(2)];

for (int x = 0; x < xmax.Length; x++) xmax[x] = int.MinValue;
for (int y = 0; y < ymax.Length; y++) ymax[y] = int.MinValue;
for (int z = 0; z < zmax.Length; z++) zmax[z] = int.MinValue;

for (int x = 0; x < xmax.Length; x++)
    for (int y = 0; y < ymax.Length; y++)
        for (int z = 0; z < zmax.Length; z++)
        {
            xmax[x] = Math.Max(xmax[x], numbers[x, y, z]);
            ymax[y] = Math.Max(ymax[y], numbers[x, y, z]);
            zmax[z] = Math.Max(zmax[z], numbers[x, y, z]);
        }

// xmax == { 3, 7 }
// ymax == { 5, 7 }
// zmax == { 6, 7 }
于 2012-09-02T16:55:26.110 に答える