2014-07-04 126 views
0

我一直在用Matlab編程了幾年。它很容易處理矩陣和數組上的操作。處理數組操作的尖銳

現在,我編程在C#和閱讀網站上,如http://msdn.microsoft.com/en-us/library/2s05feca.aspx和其他各種教程網站,過了一段時間,我還是有一些問題。

在Matlab中,是這樣的(寫在僞C#語法)將工作:

W[1][][] = new double[][]{{10,20,30},{40,50,60},}; 

其中W是3維鋸齒狀排列。我們的想法是,由於所述第一維(在這種情況下,通過1)中所定義,所述分配操作「理解」,所提供設定的2維數組的內容來填充W的兩個剩餘部分的尺寸然後,如何獲得在C#中相同的結果或行爲?

想象的W [] [] []的第一尺寸是與一個城市相關聯的號碼;第二,每個居住在那裏的人的年齡,第三,他們的體重。現在讓我們有一部分代碼創建一個包含年齡和權重值的「calculate [] []」數組。我想將此數組的內容分配給W [1] [] []。這是我沒有實現的。

我的目標是做用C#矩陣(和矩陣等相關操作)的乘法的等價物。

我再次閱讀並閱讀了一些解釋(不能在這裏列出所有內容),但它並沒有加在我的腦海裏,所以我想如果有人能夠解釋(再次)如何在C#中操作多維數組,它會幫助我理解它是如何工作的。

感謝

+0

在左邊,W是一個double [] [] [],而右邊要創建一個double [] []那並不不匹配。如果每個維度具有相同的長度,則多維數組可能會更方便:double [,,]或double [,] –

+0

對不起,我的問題不清楚。我知道這個語法不會直接在C#中工作。有沒有辦法同時分配鋸齒陣列的三個維度中的兩個。想象一下W [] [] []的第一維是與城市相關的數字;第二,每個居住在那裏的人的年齡,第三,他們的體重。現在讓我們有一部分代碼創建一個包含年齡和權重值的「calculate [] []」數組。我想將此數組的內容分配給W [1] [] []。這是我沒有實現的 – Doombot

回答

1

這不是一個3維陣列。這只是一個數組的數組。 我真的不知道你盡力去做。

無論如何,如果我有ü權ü想要做這樣的事情:

Nothing -.-

好了,如果你需要這個您的例子,那麼我會建議你一個struct爲了做到這一點更輕鬆。 如果你想了解多維數組,那麼你應該蘆葦如下:

你定義了「多維數組」是這樣的:

double[][][] array; 

這不是一個「多維數組」。這是一個數組數組(數組)的數組(列表)。

真正的「多維陣列」被定義該(3名維):

double[,,] array; 

這是一個差:d

如果u使用「真正多維數組」則u可以做上述像這個;

private static void Main(string[] args) 
{ 
    var raw = new double[,,] 
    { 
     { 
      {1, 2}, 
      {3, 4} 
     }, 
     { 
      {5, 6}, 
      {7, 8} 
     } 
    }; 

    Console.WriteLine(raw[0, 0, 0]); //1 
    Console.WriteLine(raw[1, 1, 0]); //7 
    Console.ReadKey(); 
} 

而且這將是一個數組

var raw = new double[][][] 
{ 
    new double[][] 
    { 
     new double[] 
     { 
      1, 
      3 
     }, 
     new double[] 
     { 
      2, 
      4 
     } 
    }, 
    new double[][] 
    { 
     new double[] 
     { 
      5, 
      7 
     }, 
     new double[] 
     { 
      6, 
      8 
     } 
    } 
}; 
Console.WriteLine(raw[0][0][0]); //1 
Console.WriteLine(raw[1][1][0]); //6 
Console.ReadKey(); 

數組的數組中的情況下,代碼(如果你不希望使用struct)比這個數組將是更好的方法!

用於你的情況結構是這樣的:

private static void Main(string[] args) 
    { 
     var raw = new SampleDataStruct[2] 
     { 
      new SampleDataStruct 
      { 
       CityName = "New York", AgeWeight = new AgeWeightStruct[3] 
       { 
        new AgeWeightStruct{Age = 50,Weigth = 70}, 
        new AgeWeightStruct{Age = 40,Weigth = 75}, 
        new AgeWeightStruct{Age = 30,Weigth = 65} 
       } 
      }, 

      new SampleDataStruct 
      { 
       CityName = "Berlin", AgeWeight = new AgeWeightStruct[3] 
       { 
        new AgeWeightStruct{Age = 50,Weigth = 65}, 
        new AgeWeightStruct{Age = 40,Weigth = 60}, 
        new AgeWeightStruct{Age = 30,Weigth = 55} 
       } 
      } 
     }; 

     Console.WriteLine(raw.Where(st => st.CityName == "Berlin").ElementAtOrDefault(0).AgeWeight.Where(aw => aw.Age == 40).ElementAtOrDefault(0).Weigth); //Berlin -> Age = 40 -> Display Weight (60) 
     Console.WriteLine(raw.Where(st => st.CityName == "New York").ElementAtOrDefault(0).AgeWeight.Where(aw => aw.Age == 30).ElementAtOrDefault(0).Weigth); //New York -> Age = 30 -> Display Weight (65) 
     Console.ReadKey(); 
    } 
} 

public struct SampleDataStruct 
{ 
    public string CityName; 
    public AgeWeightStruct[] AgeWeight; 
} 

public struct AgeWeightStruct 
{ 
    public int Age; 
    public int Weigth; 
} 
+0

啊,一個結構是我正在尋找的。啞我在Matlab中使用他們忘了他們也在Csharp ... – Doombot

+0

@我是否爲您的案件添加了一個結構! – coolerfarmer

+0

謝謝!會upvote,但尚未允許 – Doombot

1

你能做到這樣:

  Int32 firstDimensionSize = 3; 
      double[][][] matrix3D = new double[firstDimensionSize ][][]; 

      matrix3D[1]= new double[][] 
      { 
       new double[]{10,20,30}, 
       new double[]{40,50,60}, 
      }; 

由於Matrix3D對象數組的數組的數組。每個元素都是double [] [] - 2D鋸齒狀數組。不要忘記,matrix3D [0]和matrix3D [2]將被初始化 - null。

+0

讓我想到,只是另一個問題:是否有某種方法可以合併for循環以將所有值初始化爲0?一千次而不是新的雙[] {0,0,0,0,0,0 ... 0}? – Doombot

+0

對不起,我還沒有允許upvote,但它的作品!謝謝! – Doombot

+0

好吧,看來我可以這樣做: double [] banana = new double [] {};對於(int i = 0,i <1000,i ++) { banana [i] = 0; } 然後: 的Matrix3D [1] =新雙[] [] { 香蕉, 香蕉, }; – Doombot

1
var W = new double[][][] 
{ 
    new double[][]{ 
     new double[] {1,2,3}, new double[] {4,5,6} 
    }, 
    new double[][]{ 
     new double[] {7,8,9}, new double[] {10,11,12} 
    } 
}; 

或者,也可以使用雙[,,]如果尺寸是相同的:

var W = new double[,,] 
{ 
    { 
     {1,2,3}, {4,5,6} 
    }, 
    { 
     {7,8,9}, {10,11,12} 
    } 
}; 
+1

對不起,我還沒有允許upvote,但它也可以!謝謝! – Doombot