如何从多维数组中排序某些值,然后计算平均选定值?
因此,当我单击某个图像时,它应该显示深度数据(来自Microsoft Kinect),不仅在鼠标指针所在的位置,而且还应该计算环境中的值(这是多维数组)。
这是我的代码:
protected void imageIR_MouseClick(object sender, System.Windows.Input.MouseEventArgs e)
{
// Get the x and y coordinates of the mouse pointer.
System.Windows.Point mousePoint = e.GetPosition(imageIR);
double xpos_IR = mousePoint.X;
double ypos_IR = mousePoint.Y;
int x = (int)xpos_IR;
int y = (int)ypos_IR;
lbCoord.Content = "x- & y- Koordinate [pixel]: " + x + " ; " + y;
int d = (ushort)pixelData[x + y * this.depthFrame.Width];
d = d >> 3;
int xpos_Content = (int)((x - 320) * 0.03501 / 2 * d/10);
int ypos_Content = (int)((240 - y) * 0.03501 / 2 * d/10);
xpos.Content = "x- Koordinate [mm]: " + xpos_Content;
ypos.Content = "y- Koordinate [mm]: " + ypos_Content;
zpos.Content = "z- Koordinate [mm]: " + (d);
// Allocating array size
int i = 10;
int[] x_array = new int[i];
int[] y_array = new int[i];
int[,] d_array = new int[i,i];
for (int m = 0; m < 10; m++)
{
for (int n = 0; n < 10; n++)
{
x_array[m] = x + m;
y_array[n] = y + n;
d_array[m, n] = (ushort)pixelData[x_array[m] + y_array[n] * this.depthFrame.Width];
d_array[m, n] = d_array[m, n] >> 3;
}
}
}
所以,首先:如何将 d_array [m,n] 中的所有值相加?是否有可能计算每一行的总和( - >一维数组/向量),然后再次计算列的总和( - >零维数组/标量)?
答案 0 :(得分:18)
所以,首先:如何对d_array [m,n]
中的所有值求和
您可以使用:
int sum = d_array.Cast<int>().Sum();
这将自动展平多维数组并获取所有元素的总和。
是否可以计算每一行的总和( - >一维数组/向量),然后再次计算列的总和( - >零维数组/标量)?
是的,但这需要手动循环。虽然编写处理它的方法很容易,但是没有简单的衬里,即:
IEnumerable<T> GetRow(T[,] array, int row)
{
for (int i = 0; i <= array.GetUpperBound(1); ++i)
yield return array[row, i];
}
IEnumerable<T> GetColumn(T[,] array, int column)
{
for (int i = 0; i <= array.GetUpperBound(0); ++i)
yield return array[i, column];
}
然后你可以这样做:
var row1Sum = GetRow(d_array, 1).Sum();
答案 1 :(得分:0)
IEnumerable语法对我来说并不适用。 GetRow和GetColumn之后缺少“Angle Bracket-T-Angle bracket”。以下语法非常有用。谢谢!
public static IEnumerable<T> GetRow<T>(T[,] array, int row)
{
for (int i = 0; i <= array.GetUpperBound(1); ++i)
yield return array[row, i];
}
public static IEnumerable<T> GetColumn<T>(T[,] array, int column)
{
for (int i = 0; i <= array.GetUpperBound(0); ++i)
yield return array[i, column];
}