第14講 高次元配列と低次元配列の関係

第4話 1次元配列を3次元配列で表現する

解答コード例
Private Sub CommandButton1_Click()

  Dim a(3,
2, 4) As Integer
  Dim b(59) As Integer
  Dim i As Integer

  For i = 0 To 59
    b(i) = i + 1
  Next


  Dim j As Integer, k As Integer, l As Integer
  For i = 0 To 59
    j = Int(i / 15)
    k = Int(i / 5) Mod 3
    l = i Mod 5
    a(j, k, l) = b(i)
  Next
  For i = 0 To 3
    For j = 0 To 2
      For k = 0 To 4
        Cells(5 + 4 * i + j, 1 + k) = a(i, j, k)
      Next
    Next
  Next

End Sub
実行シート
入門
解説
ポイントは、1次元の並び0,1,2,・・・,59を如何に3次元にするかです。
次のように並べたいわけです。

0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
25 26 27 28 29
30 31 32 33 34
35 36 37 38 39
40 41 42 43 44
45 46 47 48 49
50 51 52 53 54
55 56 57 58 59

まず、

0 1 2 3 4
5 6 7 8 9
10 11 12 13 14


15 16 17 18 19
20 21 22 23 24
25 26 27 28 29


30 31 32 33 34
35 36 37 38 39
40 41 42 43 44


45 46 47 48 49
50 51 52 53 54
55 56 57 58 59

と4つのブロックに分けるには、j = Int(i / 15)でよいわけです。
というのはブロックのデータ数が15です。
  Dim a(
3, 2, 4) As Integer
この15は、(
+1)×(+1)=15の計算から求めるのでしたね。
iが0〜14なら、j = Int(i / 15)=0です。
iが15〜29なら、j = Int(i / 15)=1です。
iが30〜44なら、j = Int(i / 15)=2です。
iが45〜59なら、j = Int(i / 15)=3です。
うまく、4つのブロックに分けられていることがわかります。
尚、4ブロックに分ける必要がある理由は、
+1=4です。

次の課題は、4ブロックに分けられた0,1,2,・・・,14などを如何に3行に割り振るかです。
    k = Int(i / 5) Mod 3
なぜ、これでうまくいくのでしょうか。
まず、Int(i / 5)で0,1,2,3,4,5,6,7,8,9,10,11,12,13,14は、
0,0,0,0,0,1,1,1,1,1,2,2,2となります。
さらに、Mod 3で3で割った余りを求めても、
0,0,0,0,0,1,1,1,1,1,2,2,2で変わりありません。
しかし、0,1,2,3,4,5,6,7,8,9,10,11,12,13,14のデータが3行にうまく割り振られています。

次の15,16,17,18,19,20,21,22,23,24,25,26,27,28,29についてはどうでしょうか。
まず、Int(i / 5)によって、
3,3,3,3,3,4,4,4,4,4,5,5,5,5,5となります。
そして、Mod 3によって3で割った余りにすると、
0,0,0,0,0,1,1,1,1,1,2,2,2で今回も3行にうまく分割できています。

次の29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44についても
Int(i / 5)によって、
4,4,4,4,4,5,5,5,5,5,6,6,6,6,6となり、
Mod 3によって、
0,0,0,0,0,1,1,1,1,1,2,2,2とうまく3群に分割できています。

最後の45,46,47,48,49,50,51,52,53,54,55,56,57,58,59も
7,7,7,7,7,8,8,8,8,8,9,9,9,9,9から
0,0,0,0,0,1,1,1,1,1,2,2,2となり、望みの通りになります。
    k = Int(i / 5) Mod 3
のInt(i / 5)を実行したときに、0,1,2,3,4,5,6,7,8,9となります。
これを Mod 3によって0,1,2,0,1,2,0,1,2,0,1,2とすれば意図したとおりに実現できるわけです。
    j = Int(i / 15)
    k = Int(i / 5) Mod 3
    l = i Mod 5
これは、頭が爆発しそうなほど、難しかったですね。

さて、次の課題です。
4次元配列を1次元配列で表現してみましょう。
まず、4次元データを用意し、
Private Sub CommandButton1_Click()

  Dim a(2, 3, 4, 5) As Integer
  Dim b(359) As Integer
  Dim i As Integer, j As Integer, k As Integer, l As Integer

  For i = 0 To 2
    For j = 0 To 3
      For k = 0 To 4
        For l = 0 To 5
          a(i, j, k, l) = Int(Rnd * 100)
        Next
      Next
    Next
   Next

End Sub
次のように表示させてください。
初心者
基礎
そして、次に1次元配列に対応させてください。
対応後、シートに表示されているデータの2行下に1元配列を利用して同様に表示してください。

第3話へ 第5話へ

004
  


VBA講義第1部へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual aasic入門基礎講座へ

数学研究室に戻る