C#:是否可以使用扩展方法获取3D阵列的2D切片?
基于这两篇文章(和),我理解可能可以编写自己的扩展方法,从3D阵列中获取2D切片。我正在使用三维阵列,它们以以下方式表示空间数据:C#:是否可以使用扩展方法获取3D阵列的2D切片?,c#,C#,基于这两篇文章(和),我理解可能可以编写自己的扩展方法,从3D阵列中获取2D切片。我正在使用三维阵列,它们以以下方式表示空间数据:[层、行、列]。我希望对层索引进行切片,以便获得所选层的所有行、列和列的2D数组。但是,我还没有找到从扩展方法返回2D数组的方法。以下是我到目前为止尝试过的内容,但正如注释//Error:…: double[,,] hds // 3D array of values double[,] lay_hd; // 2D slice to be filled by ex
[层、行、列]
。我希望对层索引进行切片,以便获得所选层的所有行、列和列的2D数组。但是,我还没有找到从扩展方法返回2D数组的方法。以下是我到目前为止尝试过的内容,但正如注释//Error:…
:
double[,,] hds // 3D array of values
double[,] lay_hd; // 2D slice to be filled by extension method
for(int k = 0; k < nlay; k++)
{
lay_hd = gwhds.SliceLayer(k); // Error: Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<double>' to 'double[*,*]'
// write 2D array to text file...
}
public static IEnumerable<T> SliceLayer<T>(this T[,,] array, int lay)
{
for (var i = array.GetLowerBound(1); i <= array.GetUpperBound(1); i++)
{
for (var j = array.GetLowerBound(2); j <= array.GetUpperBound(2); j++)
{
yield return array[lay, i, j];
}
}
}
double[,]hds//3D值数组
双[,]lay_hd;//用扩展方法填充的二维切片
for(int k=0;k 对于(var i=array.GetLowerBound(1);i这两篇文章表明,可以从2D数组中获得一维IEnumerable
切片,但对于3D数组的切片,可以获得2DIEnumerable
切片
public static IEnumerable<IEnumerable<T>> SliceLayer<T>(this T[,,] array, int lay)
{
IEnumerable<T> SliceRow(int row) {
for (var j = array.GetLowerBound(2); j <= array.GetUpperBound(2); j++)
{
yield return array[lay, row, j];
}
}
for (var i = array.GetLowerBound(1); i <= array.GetUpperBound(1); i++)
{
yield return SliceRow(i);
}
}
这里根本不清楚您到底在寻找什么。请解决您的问题,这样就不会有歧义。您的SliceLayer()
方法返回一个可枚举的,但您试图将其分配给的变量是一个double[,]
。这是行不通的。网站上已经有很多帖子解释了在这种情况下如何返回双[,]
;如果这就是你想要的,你的问题是重复的。如果你认为不是,请解释为什么不是。
public static T[,] SliceLayer<T>(this T[,,] array, int lay)
{
T[,] result = new T[array.GetLength(1), array.GetLength(2)];
var lowerBound1 = array.GetLowerBound(1);
var lowerBound2 = array.GetLowerBound(2);
for (var i = lowerBound1; i <= array.GetUpperBound(1); i++)
{
for (var j = lowerBound2; j <= array.GetUpperBound(2); j++)
{
// you could just use i and j as indices here if the input
// arrays is guaranteed to have non-negative lower bounds
result[i - lowerBound1, j - lowerBound2] = array[lay, i, j];
}
}
return result;
}