나는 double[,] Array;
있습니다. 모든 elemet의 복사본을 만들지 않고 double[] ColumnArray0 = Array[0,].toArray()
및 double[] RowArray1 = Array[,1].toArray()
과 같은 것을 얻을 수 있습니까 (for를 사용하여)?2D 배열에서 1D 열 배열 및 1D 행 배열을 얻는 방법은 무엇입니까? (C# .NET)
감사합니다.
나는 double[,] Array;
있습니다. 모든 elemet의 복사본을 만들지 않고 double[] ColumnArray0 = Array[0,].toArray()
및 double[] RowArray1 = Array[,1].toArray()
과 같은 것을 얻을 수 있습니까 (for를 사용하여)?2D 배열에서 1D 열 배열 및 1D 행 배열을 얻는 방법은 무엇입니까? (C# .NET)
감사합니다.
배열은 모든 항목이 연속적으로 저장되는 메모리 영역입니다. 메모리의 데이터 레이아웃에 따라 행 또는 열에 대해서만 가능합니다. 대신 당신이 당신의 배열에 데이터를 입력하는 방법에 따라 배열 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 [,]
그래서 배열이'[,]'를 사용하여 정의 된 경우 이렇게 할 수 있습니까? – AdamMc331
:
또한 여기 봐.질문의 첫 번째 중요한 부분은 행렬의 전체 행 또는 열을 액세스 할 수 있어야한다는 것입니다.
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.
주의해야 할
우선 당신이 [,] 어떤 종류의 이러한 일반적인 방법을 사용할 수 있다는 것입니다 - 행렬 및 대응하는 [] - 벡터. T
을 double
으로 바꾼다고 가정하면 OP에서 묻는 것처럼 특정 버전의 'double'을 얻게됩니다.
둘째로 행을 가져오고 설정하는 데 Array.Copy
을 사용하는 반면 열을 가져오고 설정하면 루프가 사용됩니다. 이는 Row-Major order (C# 기준)으로, 두 번째는 허용하지 않습니다. 물론 두 가지 모두 주석 처리 된 것처럼 루프로 구현 될 수 있습니다.
set-Methods에 대해 올바른 치수를 전달했는지 확인하십시오. 그러면 프로그램이 충돌합니다 (오류 및 치수 확인을 쉽게 추가 할 수 있음). double[][]
과 같은 들쭉날쭉 한 배열에 대해서도 전체 로직을 구현할 수 있지만, OP는 다차원 어레이를 특별히 요구했습니다.
질문의 두 번째 부분은 매트릭스가 double으로 구성되고 double이 값 유형이므로 값이 항상 복사됩니다. 따라서 값을 복사하지 않으려는 원하는 동작은 불가능합니다. 그러나 객체를 T
으로 사용하는 경우 객체를 가리키는 참조 만 복사되며 객체 자체는 복사하지 않습니다 (따라서 '복사 된 객체의 변형).
마지막으로, 이중 값을 복사하지 않으려면 전체 행렬 (참조 만 전달됨)을 전달한 다음 원하는 열 및/또는 행을 통해 직접 반복하는 것이 좋습니다.
질문이 없지만 어쨌든 왜해야합니까? –
Im 이미지 (2D 배열)에 FFT를 구현하려고 시도하고 행에 콜론을 호출 한 다음 1um FFT로 구현했습니다. 불필요한 배열이나 사이클을 만들지 않는 것이 좋습니다.(FFT는 시간과 메모리를 소비합니다.) –
당신이 직접 이미지 처리 알고리즘을 구현해서는 안되며, C#에서 이미지를위한 FFT를 찾으십시오. 사람들이 이미 그것을 찾았을 것입니다. 그것은 OpenCV C# 에 대한 구현 될 수도 또는 생산 목적을 위해, 그냥 matlab 또는 그와 같은 스틱 –