Chociaż jest bardzo późno, chcę zapewnić alternatywną odpowiedź na pytanie.
Pierwszą ważną częścią pytania było uzyskanie dostępu do kompletnych wierszy LUB kolumn macierzy. Jedną z możliwości robi to za pomocą metody rozszerzenie: przykład
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];
}
}
Zastosowanie:
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.
Pierwszą rzeczą, aby pamiętać, jest to, że można korzystać z tych metod generycznych z wszelkiego rodzaju [,] - matryce i odpowiednie [] -ektory. Wyobraź sobie, że zastąpienie s z double
s, a otrzymasz specjalną wersję dla "podwójny" (jak było zadawane przez OP).
Po drugie, pobieranie i ustawianie wierszy odbywa się za pomocą Array.Copy
, natomiast pobieranie i ustawianie kolumn odbywa się za pomocą pętli. Jest to spowodowane wartością C# Row-Major order, która umożliwia pierwszą, ale nie drugą. Oczywiście oba mogą być zaimplementowane z pętlą, jak to zauważyłem.
Upewnij się, że przekazałeś poprawne wymiary zestawu metod, lub program się zawiesi (można łatwo dodać kontrolę błędów i wymiarów). Cała logika mogłaby być równie dobrze wdrożona dla poszarpanych tablic, takich jak double[][]
, jednak OP szczegółowo zapytał o te wielowymiarowe.
Co do drugiej części pytania: Jeśli twoja macierz składa się z podwójnej, a ponieważ podwójne jest typem wartości, wartości będą zawsze kopiowane. Zatem pożądane zachowanie braku kopiowania wartości nie byłoby możliwe. Jednak w przypadku używania obiektów jako T
tylko odwołanie wskazujące obiekt zostanie skopiowane, a nie sam obiekt (więc uważaj na mutowanie obiektu "skopiowanego").
Wreszcie, jeśli naprawdę nie chcesz kopiować podwójnych wartości, sugerowałbym przekazanie całej macierzy (tylko referencja jest przekazywana), a następnie bezpośrednie przejście przez żądane kolumny i/lub wiersze.
Nie dostaję twojego pytania, ale dlaczego i tak miałbyś to robić? –
Próbuję zaimplementować FFT na obrazie (tablica 2D) i zaimplementowane przez 1D FFT wywołujące wiersze, a następnie na kolumnach. Byłoby miło nie robić niepotrzebnych tablic ani cykli.(FFT zajmuje dużo czasu i pamięci) –
Myślę, że nie powinieneś sam wdrażać algorytmów przetwarzania obrazu, poszukaj FFT dla obrazów w C# i możesz znaleźć ludzi, którzy już je wykonali. może być zaimplementowany dla OpenCV dla C# lub jeśli nie jest to do celów produkcyjnych, po prostu trzymaj się z Matlaba lub coś w tym stylu –