2013-05-19 2 views
6

나는 double[,] Array; 있습니다. 모든 elemet의 복사본을 만들지 않고 double[] ColumnArray0 = Array[0,].toArray()double[] RowArray1 = Array[,1].toArray()과 같은 것을 얻을 수 있습니까 (for를 사용하여)?2D 배열에서 1D 열 배열 및 1D 행 배열을 얻는 방법은 무엇입니까? (C# .NET)

감사합니다.

+0

질문이 없지만 어쨌든 왜해야합니까? –

+0

Im 이미지 (2D 배열)에 FFT를 구현하려고 시도하고 행에 콜론을 호출 한 다음 1um FFT로 구현했습니다. 불필요한 배열이나 사이클을 만들지 않는 것이 좋습니다.(FFT는 시간과 메모리를 소비합니다.) –

+1

당신이 직접 이미지 처리 알고리즘을 구현해서는 안되며, C#에서 이미지를위한 FFT를 찾으십시오. 사람들이 이미 그것을 찾았을 것입니다. 그것은 OpenCV C# 에 대한 구현 될 수도 또는 생산 목적을 위해, 그냥 matlab 또는 그와 같은 스틱 –

답변

2

배열은 모든 항목이 연속적으로 저장되는 메모리 영역입니다. 메모리의 데이터 레이아웃에 따라 행 또는 열에 대해서만 가능합니다. 대신 당신이 당신의 배열에 데이터를 입력하는 방법에 따라 배열 double[][]

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

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

의 배열을 사용하여 귀하의 경우에는 더 차원 배열 double[,] 유형의

, 당신은 또한으로 Array2d를 처리 할 수 ​​있습니다 열 배열. 그러나 동시에 둘 다를 가질 수는 없습니다. 존재가 매우 늦게, 나는이 질문에 다른 대답을 제공하고자하지만 Multidimensional Array [][] vs [,]

+11

그래서 배열이'[,]'를 사용하여 정의 된 경우 이렇게 할 수 있습니까? – AdamMc331

3

:

또한 여기 봐.

질문의 첫 번째 중요한 부분은 행렬의 전체 행 또는 열을 액세스 할 수 있어야한다는 것입니다.

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. 
주의해야 할

우선 당신이 [,] 어떤 종류의 이러한 일반적인 방법을 사용할 수 있다는 것입니다 - 행렬 및 대응하는 [] - 벡터. Tdouble으로 바꾼다고 가정하면 OP에서 묻는 것처럼 특정 버전의 'double'을 얻게됩니다.

둘째로 행을 가져오고 설정하는 데 Array.Copy을 사용하는 반면 열을 가져오고 설정하면 루프가 사용됩니다. 이는 Row-Major order (C# 기준)으로, 두 번째는 허용하지 않습니다. 물론 두 가지 모두 주석 처리 된 것처럼 루프로 구현 될 수 있습니다.

set-Methods에 대해 올바른 치수를 전달했는지 확인하십시오. 그러면 프로그램이 충돌합니다 (오류 및 치수 확인을 쉽게 추가 할 수 있음). double[][]과 같은 들쭉날쭉 한 배열에 대해서도 전체 로직을 구현할 수 있지만, OP는 다차원 어레이를 특별히 요구했습니다.

질문의 두 번째 부분은 매트릭스가 double으로 구성되고 double이 값 유형이므로 값이 항상 복사됩니다. 따라서 값을 복사하지 않으려는 원하는 동작은 불가능합니다. 그러나 객체를 T으로 사용하는 경우 객체를 가리키는 참조 만 복사되며 객체 자체는 복사하지 않습니다 (따라서 '복사 된 객체의 변형).

마지막으로, 이중 값을 복사하지 않으려면 전체 행렬 (참조 만 전달됨)을 전달한 다음 원하는 열 및/또는 행을 통해 직접 반복하는 것이 좋습니다.

관련 문제