2007-12-25

行列の積

  1. 前回の解答

    Sub 行列の和()
    Dim x() As Single, y() As Single, z() As Single, i As Integer, j As Integer, gyou1 As Integer, retu1 As Integer, gyou2 As Integer, retu2 As Integer

    Sheets(1).Select
    i = 1
    Do While Cells(i, 1) <> "" And IsNumeric(Cells(i, 1))
     i = i + 1
    Loop
    gyou1 = i - 1

    i = 1
    Do While Cells(1, i) <> "" And IsNumeric(Cells(1, i))
     i = i + 1
    Loop
    retu1 = i - 1

    Sheets(2).Select
    i = 1
    Do While Cells(i, 1) <> "" And IsNumeric(Cells(i, 1))
     i = i + 1
    Loop
    gyou2 = i - 1

    i = 1
    Do While Cells(1, i) <> "" And IsNumeric(Cells(1, i))
     i = i + 1
    Loop
    retu2 = i - 1

    If gyou1 = gyou2 And retu1 = retu2 Then
     ReDim x(gyou1, retu1)
     ReDim y(gyou1, retu1)
     ReDim z(gyou1, retu1)

     Sheets(1).Select
     For i = 1 To gyou1
      For j = 1 To retu1
       x(i, j) = Cells(i, j)
      Next j
     Next i

     Sheets(2).Select
     For i = 1 To gyou1
      For j = 1 To retu1
       y(i, j) = Cells(i, j)
      Next j
     Next i

     For i = 1 To gyou1
      For j = 1 To retu1
       z(i, j) = x(i, j) + y(i, j)
      Next j
     Next i

     Sheets(3).Select
     For i = 1 To gyou1
      For j = 1 To retu1
       Cells(i, j) = z(i, j)
      Next j
     Next i
    Else
     Sheets(3).Select
     Msgbox ("行列の型が異なるので足し算できません")
    End If

    End Sub

  2. 行列の積

    以前載せた練習問題

    をまだ考えていない人は、プログラミングの前にまずこの問題をノートで考えてください。

    今回は、行列の掛け算のプログラムを考えます。
    まず、2行2列の行列の掛け算から計算しましょう。
    =
    の掛け算をすると、


    となります。これをプログラムで書くと、

    c(1,1)=a(1,1)*b(1,1)+a(1,2)*b(2,1)
    c(1,2)=a(1,1)*b(1,2)+a(1,2)*b(2,2)
    c(2,1)=a(2,1)*b(1,1)+a(2,2)*b(2,1)
    c(2,2)=a(2,1)*b(1,2)+a(2,2)*b(2,2)

    となります。

  3. 練習問題1
    次の行列の掛け算をするプログラムを書きなさい。

  4. このままではもっと大きな行列の計算ができないので、For文を使って書き直します。
    まず、Cの成分ごとに4行に分けて書いている部分を
    For i=1 to 2
        For j=1 to 2
            c(i,j)=a(i,1)*b(1,j)+a(i,2)*b(2,j)
        Next j
    Next i
    
    のようにFor文による繰り返しで書きます。さらに、c(i,j)=a(i,1)*b(1,j)+a(i,2)*b(2,j)の部分もFor文による繰り返しを使って
    For i=1 to 2
      For j=1 to 2
        c(i,j)=0
        For k=1 to 2
          c(i,j)=c(i,j)+a(i,k)*b(k,j)
        Next k
       Next j
    Next i
    
    のように書きます。

  5. 練習問題2
    2行2列に限らず,行列の型を数えて、掛け算できる時には掛け算をし,掛け算できないときは出来ないと表示するプログラムを書きなさい。

0 件のコメント: