2013-05-19 13 views
6

double[,] Array; var. double[] ColumnArray0 = Array[0,].toArray() ve double[] RowArray1 = Array[,1].toArray() gibi bir şey elde etmek, her bir elemetin bir kopyasını yapmaksızın mümkün mü?2B dizisinden 1D sütun dizisi ve 1D sıra dizisi nasıl alınır? (C# .NET)

Teşekkürler.

+0

Sorunu anlamıyorum, ama neden bunu yapmak zorundasınız ki? –

+0

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) –

+1

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 –

cevap

2

Diziler, tüm girişlerin ardışık olarak depolandığı bir bellek alanıdır. Hafızadaki veri düzenine bağlı olarak, bu sadece satır veya sütunlar için mümkündür. Bunun yerine size dizideki verileri koymak nasıl bağlı diziler double[][]

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

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

bir dizi kullanacak şekilde durumda daha iyidir 2d dizi double[,] Çeşidi

, ayrıca bir şekilde Array2d davranabilirsiniz sütun dizisi. Ancak her ikisine birden sahip olmak mümkün değildir. olmak çok geç, soruya bir alternatif cevap sağlamak istiyoruz rağmen Multidimensional Array [][] vs [,]

+11

gibi bir şeye yapıştırabilirsiniz. Yani, dizi [,] 'kullanılarak tanımlanmışsa bunu yapmanın bir yolu yok mu? – AdamMc331

3

:

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.