:
Ayrıca buraya bir göz var.
Sorunun ilk önemli kısmı, matrisin tam satırlarına VEYA sütunlarına erişebilmekti.
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];
}
}
Kullanım örneği: Bu yapmanın bir olasılık uzatma yöntemleri kullanmaktır
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.
nota
ilk şey [,] her türlü ile bu jenerik yöntemleri kullanabilirsiniz olmasıdır - matrisleri ve karşılık gelen [] -vektörler. T
s'yi double
s ile değiştirmeyi düşünün ve 'çift' için (OP tarafından soruldu) belirli bir versiyonunu elde edersiniz.
İkincisi, satırları alma ve ayarlama, satırları alma ve ayarlama sırasında bir döngü kullanan Array.Copy
kullanır. Bu, ilk, ancak ikinci izin veren Row-Major order C# nedeniyle oluşur. Tabii ki her ikisi de görüldüğü gibi bir döngü ile uygulanabilir.
Set-Yöntemleri için doğru boyutları geçtiğinizden emin olun, aksi takdirde program çökecektir (hata ve boyut denetimi kolayca eklenebilir). Bütün mantık, double[][]
gibi pürüzlü diziler için de uygulanabilirdi, ancak OP, çok boyutlu olanlara özel olarak soruldu.
Sorunun ikinci kısmına gelince: Matrisiniz iki katından oluşuyorsa ve çift değer bir değer olduğundan, değerler her zaman kopyalanır. Yani, değerleri kopyalamamanız için istediğiniz davranış mümkün olmaz. Ancak, T
olarak nesneler kullanılıyorsa, yalnızca nesneye işaret eden referans kopyalanacak ve nesnenin kendisi kopyalanmayacaktır (bu nedenle 'kopyalanan' nesneyi mutasyona uğratmaya dikkat edin).
Son olarak, çift değerleri gerçekten kopyalamak istemezseniz, tüm matrisinizi (yalnızca referans iletilir) geçirmeyi ve ardından doğrudan istenen sütunlar ve/veya satırlar arasında döngü yapmayı öneririm.
Sorunu anlamıyorum, ama neden bunu yapmak zorundasınız ki? –
Görüntüde FFT'yi uygulamaya çalışıyorum (2D dizisi) ve 1D FFT tarafından satırlarda ve ardından sütunlarda çağrılıyor. Gereksiz diziler veya döngüler yapmamak iyi olur.(FFT zaman ve hafıza tüketir) –
Sanırım görüntü işleme algoritmalarını kendiniz uygulamamalı, C# 'deki görüntüler için FFT'yi aramalı ve zaten yapmış olduğunuz kişileri bulabilirsin. C# için OpenCV için uygulanabilir veya üretim amaçlı değilse, matlab ile ya da –