如何从二维数组中获取一维列数组和一维行数组? (C#.NET)

Posted

技术标签:

【中文标题】如何从二维数组中获取一维列数组和一维行数组? (C#.NET)【英文标题】:How to get 1D column array and 1D row array from 2D array? (C# .NET) 【发布时间】:2013-05-14 05:08:25 【问题描述】:

我有double[,] Array;。是否有可能在不复制每个元素(用于)的情况下获得 double[] ColumnArray0 = Array[0,].toArray()double[] RowArray1 = Array[,1].toArray() 之类的东西?

谢谢。

【问题讨论】:

我不明白你的问题,但你为什么需要这样做? 我试图在图像(2D 数组)上实现 FFT,并通过 1D FFT 调用行和列来实现。最好不要做任何不必要的数组或循环。(FFT 是时间和内存消耗) 我猜你不应该自己实现图像处理算法,在 C# 中寻找图像的 FFT,你可能会发现人们已经做到了。它可以为 C# 的 OpenCV 实现,或者如果它不是用于生产目的,只需坚持使用 matlab 或类似的东西 【参考方案1】:

虽然已经很晚了,但我想为这个问题提供一个替代答案。

问题的第一个重要部分是能够访问矩阵的完整行或列。这样做的一种可能性是使用扩展方法:

public static class MatrixExtensions

  /// <summary>
  /// Returns the row with number 'row' of this matrix as a 1D-Array.
  /// </summary>
  public static T[] GetRow<T>(this T[,] matrix, int row)
  
    var rowLength = matrix.GetLength(1);
    var rowVector = new T[rowLength];

    for (var i = 0; i < rowLength; i++)
      rowVector[i] = matrix[row, i];

    return rowVector;
  



  /// <summary>
  /// Sets the row with number 'row' of this 2D-matrix to the parameter 'rowVector'.
  /// </summary>
  public static void SetRow<T>(this T[,] matrix, int row, T[] rowVector)
  
    var rowLength = matrix.GetLength(1);

    for (var i = 0; i < rowLength; i++)
      matrix[row, i] = rowVector[i];
  



  /// <summary>
  /// Returns the column with number 'col' of this matrix as a 1D-Array.
  /// </summary>
  public static T[] GetCol<T>(this T[,] matrix, int col)
  
    var colLength = matrix.GetLength(0);
    var colVector = new T[colLength];

    for (var i = 0; i < colLength; i++)
      colVector[i] = matrix[i, col];

    return colVector;
  



  /// <summary>
  /// Sets the column with number 'col' of this 2D-matrix to the parameter 'colVector'.
  /// </summary>
  public static void SetCol<T>(this T[,] matrix, int col, T[] colVector)
  
    var colLength = matrix.GetLength(0);

    for (var i = 0; i < colLength; i++)
      matrix[i, col] = colVector[i];
  

使用示例:

double[,] myMatrix = ... // Initialize with desired size and values.
double[] myRowVector = myMatrix.GetRow(2); // Gets the third row.
double[] myColVector = myMatrix.GetCol(1); // Gets the second column.
myMatrix.SetCol(2, myColVector); // Sets the third column to the second column.

首先要注意的是,您可以将这些通用方法与任何类型的 [,] 矩阵和相应的 [] 向量一起使用。想象一下用doubles 替换Ts,你会得到'double' 的特定版本(正如OP 所要求的那样)。

第二件事是,获取和设置行使用Array.Copy,而获取和设置列使用循环。这是由于 C# 的 Row-Major order 允许第一个,但不允许第二个。当然,正如注释掉的那样,两者都可以通过循环来实现。

确保为 set-Methods 传递正确的维度,否则程序将崩溃(可以轻松添加错误和维度检查)。整个逻辑也可以针对double[][] 之类的锯齿数组实现,但是,OP 专门要求提供多维数组。

至于问题的第二部分:如果您的矩阵由 double 组成,并且由于 double 是一种值类型,那么这些值将始终被复制。因此,您想要的不复制值的行为是不可能的。但是,如果将对象用作T,则只会复制指向该对象的引用,而不会复制对象本身(因此请注意改变“复制的”对象)。

最后,如果您真的不想复制双精度值,我建议您传递整个矩阵(仅传递引用),然后直接循环遍历所需的列和/或行。

【讨论】:

【参考方案2】:

数组是一个内存区域,其中所有条目都以连续的方式存储。根据内存中的数据布局,这仅适用于行或列。

在您的情况下,最好使用数组数组double[][],而不是二维数组double[,]

double[][] Array2d = new double[10][];
Array2d[0] = new double[10];
Array2d[1] = new double[10];
...

and then:
double[] RowArray0 = Array2d[0];

根据您将数据放入数组的方式,您还可以将Array2d 视为列数组。但同时拥有两者是不可能的。

也可以看看这里: Multidimensional Array [][] vs [,]

【讨论】:

那么,如果数组是使用[,]定义的,有没有办法做到这一点?

以上是关于如何从二维数组中获取一维列数组和一维行数组? (C#.NET)的主要内容,如果未能解决你的问题,请参考以下文章

C语言 二维数组遍历

android 能不能在array文件里定义二维数组而不单单是一维数组

二维数组_一维数组

dev c++,二维数组的第一维赋值出错?

C-二维数组, 字符串, 指针

egret之一维,二维数组