トップ回答者
多数ある三次元配列を1つの変数に格納

質問
回答
-
> どのような方法でも良いのですが、配列数の違う三次元配列を一つの変数に値をまとめたいです。
「どのような方法でも良い」と言っても、まとめた結果を質問者さんが意図するように使えなけれれば意味がないですよね?
だから先の私のレスでどのように使うのかを書いてくださいとお願いしたのですが、話は伝わっているでしょうか?
何でもいいと言うなら List(of T) 型にまとめるのが簡単そうですが、それで質問者さんの目的に使えるのですか?
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年8月4日 1:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年8月10日 4:58
-
複数の3次元配列に対して4引数でアクセスする方法はいくつか考えつくけど、どれがやりたいことなのでしょう
Module Module1 Sub Main() Dim parameter1(6, 5, 1000) As Double Dim parameter2(6, 5, 500) As Double Dim parameter3(5, 4, 1000) As Double '多次元配列の配列で Dim ary As Double()(,,) = New Double(2)(,,) {} ary(0) = parameter1 ary(1) = parameter2 ary(2) = parameter3 ary(0)(0, 0, 0) = 1 ary(1)(0, 0, 0) = 2 ary(2)(0, 0, 0) = 3 Dim ary2 As Double()(,,) = {parameter1, parameter2, parameter3} ary2(0)(0, 0, 0) = 11 ary2(1)(0, 0, 0) = 12 ary2(2)(0, 0, 0) = 13 'Listで Dim list As New List(Of Double(,,))() list.Add(parameter1) list.Add(parameter2) list.Add(parameter3) list(0)(0, 0, 1) = 21 list(1)(0, 0, 1) = 22 list(2)(0, 0, 1) = 23 'クラスで Dim parameterData As New ParameterData parameterData.Add(parameter1) parameterData.Add(parameter2) parameterData.Add(parameter3) parameterData(0)(0, 0, 2) = 31 parameterData(1)(0, 0, 2) = 32 parameterData(2)(0, 0, 2) = 33 parameterData(0, 0, 0, 3) = 41 parameterData(1, 0, 0, 3) = 42 parameterData(2, 0, 0, 3) = 43 '構造体で Dim parameterData2 As New ParameterData2 parameterData2.parameter1 = parameter1 parameterData2.parameter2 = parameter2 parameterData2.parameter3 = parameter3 parameterData(0)(0, 0, 4) = 51 parameterData(1)(0, 0, 4) = 52 parameterData(2)(0, 0, 4) = 53 parameterData(0, 0, 0, 5) = 61 parameterData(1, 0, 0, 5) = 62 parameterData(2, 0, 0, 5) = 63 End Sub End Module ''' <summary>Listを継承して</summary> Class ParameterData Inherits List(Of Double(,,)) ''' <summary>4次元配列のようなアクセスのように見えるプロパティ</summary> Default Public Overloads Property Item(index As Integer, x As Integer, y As Integer, z As Integer) As Double Get Return MyBase.Item(index)(x, y, z) End Get Set(value As Double) MyBase.Item(index)(x, y, z) = value End Set End Property End Class ''' <summary>構造体で</summary> Structure ParameterData2 Public parameter1(,,) As Double Public parameter2(,,) As Double Public parameter3(,,) As Double Default Public Overloads Property Item(index As Integer) As Double(,,) Get Select Case (index) Case 0 Return parameter1 Case 1 Return parameter2 Case 2 Return parameter3 Case Else Throw New ArgumentOutOfRangeException() End Select End Get Set(value As Double(,,)) Select Case (index) Case 0 parameter1 = value Case 1 parameter2 = value Case 2 parameter3 = value Case Else Throw New ArgumentOutOfRangeException() End Select End Set End Property ''' <summary>4次元配列のようなアクセスのように見えるプロパティ</summary> Default Public Overloads Property Item(index As Integer, x As Integer, y As Integer, z As Integer) As Double Get Dim para As Double(,,) = Me.Item(index) Return para(x, y, z) End Get Set(value As Double) Dim para As Double(,,) = Me.Item(index) para(x, y, z) = value End Set End Property End Structure
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年8月4日 1:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年8月10日 4:58
-
SurferOnWwwさんが書かれているようにどのように使用するかによってまとめ方が変わってくると思いますが、とりあえずジャグ配列をご存知なければ調べてみて下さい。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年8月4日 1:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年8月10日 4:58
すべての返信
-
返信ありがとうございます。
どう説明すればよいかわかりませんが、
下記の様に、配列数の違う複数の三次元配列を
parameter1(x1,y1,z1)
parameter2(x2,y2,z2)
parameter3(x3,y3,z3)
1つのParameterDataという4次元配列に格納するか、
または、ParameterDataという構造体に上記の配列を格納したいと思っています。
ParameterData.parameter1
ParameterData.parameter2
ParameterData.parameter3
とりあえず、どのような方法でも良いのですが、配列数の違う三次元配列を一つの変数に値をまとめたいです。
説明不足かもしれませんが、よろしくお願いします。
-
> どのような方法でも良いのですが、配列数の違う三次元配列を一つの変数に値をまとめたいです。
「どのような方法でも良い」と言っても、まとめた結果を質問者さんが意図するように使えなけれれば意味がないですよね?
だから先の私のレスでどのように使うのかを書いてくださいとお願いしたのですが、話は伝わっているでしょうか?
何でもいいと言うなら List(of T) 型にまとめるのが簡単そうですが、それで質問者さんの目的に使えるのですか?
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年8月4日 1:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年8月10日 4:58
-
複数の3次元配列に対して4引数でアクセスする方法はいくつか考えつくけど、どれがやりたいことなのでしょう
Module Module1 Sub Main() Dim parameter1(6, 5, 1000) As Double Dim parameter2(6, 5, 500) As Double Dim parameter3(5, 4, 1000) As Double '多次元配列の配列で Dim ary As Double()(,,) = New Double(2)(,,) {} ary(0) = parameter1 ary(1) = parameter2 ary(2) = parameter3 ary(0)(0, 0, 0) = 1 ary(1)(0, 0, 0) = 2 ary(2)(0, 0, 0) = 3 Dim ary2 As Double()(,,) = {parameter1, parameter2, parameter3} ary2(0)(0, 0, 0) = 11 ary2(1)(0, 0, 0) = 12 ary2(2)(0, 0, 0) = 13 'Listで Dim list As New List(Of Double(,,))() list.Add(parameter1) list.Add(parameter2) list.Add(parameter3) list(0)(0, 0, 1) = 21 list(1)(0, 0, 1) = 22 list(2)(0, 0, 1) = 23 'クラスで Dim parameterData As New ParameterData parameterData.Add(parameter1) parameterData.Add(parameter2) parameterData.Add(parameter3) parameterData(0)(0, 0, 2) = 31 parameterData(1)(0, 0, 2) = 32 parameterData(2)(0, 0, 2) = 33 parameterData(0, 0, 0, 3) = 41 parameterData(1, 0, 0, 3) = 42 parameterData(2, 0, 0, 3) = 43 '構造体で Dim parameterData2 As New ParameterData2 parameterData2.parameter1 = parameter1 parameterData2.parameter2 = parameter2 parameterData2.parameter3 = parameter3 parameterData(0)(0, 0, 4) = 51 parameterData(1)(0, 0, 4) = 52 parameterData(2)(0, 0, 4) = 53 parameterData(0, 0, 0, 5) = 61 parameterData(1, 0, 0, 5) = 62 parameterData(2, 0, 0, 5) = 63 End Sub End Module ''' <summary>Listを継承して</summary> Class ParameterData Inherits List(Of Double(,,)) ''' <summary>4次元配列のようなアクセスのように見えるプロパティ</summary> Default Public Overloads Property Item(index As Integer, x As Integer, y As Integer, z As Integer) As Double Get Return MyBase.Item(index)(x, y, z) End Get Set(value As Double) MyBase.Item(index)(x, y, z) = value End Set End Property End Class ''' <summary>構造体で</summary> Structure ParameterData2 Public parameter1(,,) As Double Public parameter2(,,) As Double Public parameter3(,,) As Double Default Public Overloads Property Item(index As Integer) As Double(,,) Get Select Case (index) Case 0 Return parameter1 Case 1 Return parameter2 Case 2 Return parameter3 Case Else Throw New ArgumentOutOfRangeException() End Select End Get Set(value As Double(,,)) Select Case (index) Case 0 parameter1 = value Case 1 parameter2 = value Case 2 parameter3 = value Case Else Throw New ArgumentOutOfRangeException() End Select End Set End Property ''' <summary>4次元配列のようなアクセスのように見えるプロパティ</summary> Default Public Overloads Property Item(index As Integer, x As Integer, y As Integer, z As Integer) As Double Get Dim para As Double(,,) = Me.Item(index) Return para(x, y, z) End Get Set(value As Double) Dim para As Double(,,) = Me.Item(index) para(x, y, z) = value End Set End Property End Structure
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年8月4日 1:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年8月10日 4:58
-
SurferOnWwwさんが書かれているようにどのように使用するかによってまとめ方が変わってくると思いますが、とりあえずジャグ配列をご存知なければ調べてみて下さい。
★良い回答には回答済みマークを付けよう! MVP - .NET http://d.hatena.ne.jp/trapemiya/
- 回答の候補に設定 立花楓Microsoft employee, Moderator 2017年8月4日 1:12
- 回答としてマーク 立花楓Microsoft employee, Moderator 2017年8月10日 4:58