none
多数ある三次元配列を1つの変数に格納 RRS feed

  • 質問

  • VB.NET初心者です。

    多数ある三次元配列を1つの変数に格納したいのですが、

    どうのように格納すればよいか教えてください。

    Dim parameter1(6,5,1000) As Double

    Dim parameter2(6,5,500) As Double

    Dim parameter3(5,4,1000) As Double

    上記の様な三次元配列が3つあったとして、

    これをParameterDataという変数に、四次元配列?List?として格納したいのですが、

    方法がわかりません。

    よろしくお願い致します。

    2017年8月3日 3:43

回答

  • > どのような方法でも良いのですが、配列数の違う三次元配列を一つの変数に値をまとめたいです。

    「どのような方法でも良い」と言っても、まとめた結果を質問者さんが意図するように使えなけれれば意味がないですよね?

    だから先の私のレスでどのように使うのかを書いてくださいとお願いしたのですが、話は伝わっているでしょうか?

    何でもいいと言うなら List(of T) 型にまとめるのが簡単そうですが、それで質問者さんの目的に使えるのですか?

    2017年8月3日 8:53
  • 複数の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!)

    2017年8月3日 9:09
  • SurferOnWwwさんが書かれているようにどのように使用するかによってまとめ方が変わってくると思いますが、とりあえずジャグ配列をご存知なければ調べてみて下さい。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年8月3日 9:13
    モデレータ

すべての返信

  • 全体的なシナリオを含めたやりたいこと、その「四次元配列?List?」をどのように使うのかを書いてください。
    2017年8月3日 3:52
  • 返信ありがとうございます。

    どう説明すればよいかわかりませんが、

    下記の様に、配列数の違う複数の三次元配列を

    parameter1(x1,y1,z1)

    parameter2(x2,y2,z2)

    parameter3(x3,y3,z3)

    1つのParameterDataという4次元配列に格納するか、

    または、ParameterDataという構造体に上記の配列を格納したいと思っています。

    ParameterData.parameter1

    ParameterData.parameter2

    ParameterData.parameter3

    とりあえず、どのような方法でも良いのですが、配列数の違う三次元配列を一つの変数に値をまとめたいです。

    説明不足かもしれませんが、よろしくお願いします。

    2017年8月3日 4:43
  • Dim ParameterData As New List(Of List(Of Double))
    
    ParameterData.Add(New List(Of Double)(New Double() {6, 5, 10000}))
    ParameterData.Add(New List(Of Double)(New Double() {6, 5, 500}))
    ParameterData.Add(New List(Of Double)(New Double() {5, 4, 1000}))
    こんな感じ?
    2017年8月3日 5:08
  • 返信ありがとうございます。

    返信頂いたコードだと二段階に入れ子になったListだと思うのですが、

    parameter1(x1,y1,z1)が三次元配列となっているので、

    四段階に入れ子になったListを作りたいと思うのですが、できますか?

    ※parameter1(x1,y1,z1)のx1,y1,z1は配列の要素の数になっています。


    • 編集済み ssayu 2017年8月3日 5:50
    2017年8月3日 5:47
  • > どのような方法でも良いのですが、配列数の違う三次元配列を一つの変数に値をまとめたいです。

    「どのような方法でも良い」と言っても、まとめた結果を質問者さんが意図するように使えなけれれば意味がないですよね?

    だから先の私のレスでどのように使うのかを書いてくださいとお願いしたのですが、話は伝わっているでしょうか?

    何でもいいと言うなら List(of T) 型にまとめるのが簡単そうですが、それで質問者さんの目的に使えるのですか?

    2017年8月3日 8:53
  • 複数の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!)

    2017年8月3日 9:09
  • SurferOnWwwさんが書かれているようにどのように使用するかによってまとめ方が変わってくると思いますが、とりあえずジャグ配列をご存知なければ調べてみて下さい。

    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2017年8月3日 9:13
    モデレータ
  • 返信ありがとうございます。

    三次元データを格納し、別クラスから格納した三次元データを呼び出して使いたいと思っていました。

    List(of T)型にまとめることができました。

    アドバイスありがとうございました。

    2017年8月7日 1:00
  • 返信ありがとうございました。

    多くの格納方法教えて頂き、とても参考になりました。

    何通りか試して、使いやすい格納方法を使用したいと思います。

    ありがとうございました。

    2017年8月7日 1:05
  • 返信ありがとうございます。

    ジャグ配列は知らなかったので、参考になります。

    ありがとうございました。

    2017年8月7日 1:07