因为在一个程序中要反复的用到矩阵相乘,我想把矩阵的乘法写到一个函数里面,可是写不成功,函数可以用二维数组作为参数吗。请大仙们指点。
类似: Sub multi(a(),b())
   dim c() as double    
   Dim i As Integer, j As Integer, n As Integer
          For i = 1 To 3
              For j = 1 To 3
                 For n = 1 To 2
                     c(i, j) = c(i, j) + a(i, n) * b(n, j)
                 Next n
              Next j
          Next i
            
          图形学.AutoRedraw = True
          For i = 1 To 3
                  For j = 1 To 3
                      Print c(i, j)  
                  Next j
          Next i
  
  End Sub

解决方案 »

  1.   

    参数传递没问题.
    dim c() as double 
    c()没有初始化就赋值,当然要出错.
      

  2.   

    Sub multi(a(),b()) '首先应校验ubound(a,2)=ubound(b,1)dim c() as double  
    redim c(ubound(a,1),ubound(b,2))
    ...............
      

  3.   

    Public Function MatMultiply(x() As Double, y() As Double) As Double()
        Dim n As Integer
        Dim m As Integer
        Dim p As Integer
        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim z() As Double
        n = UBound(x, 1)
        m = UBound(x, 2)
        p = UBound(y, 2)
        ReDim z(1 To n, 1 To p)
        
        'ReDim z(n, p)
        If m <> UBound(y, 1) Then
            MsgBox ("这两个矩阵不能相乘!" + Str$(m) + Str$(UBound(y, 1)))
        Else
            For i = 1 To n
                For j = 1 To m
                    For k = 1 To p
                        z(i, k) = z(i, k) + x(i, j) * y(j, k)
                    Next k
                Next j
            Next i
        End If
        MatMultiply = z
    End Function调用方法:
    a=MatMultiply(x,y),其中a必须定义成动态数组,dim a() as double
      

  4.   

    上面这位大仙你好,你的函数挺好用,不过现在还有个小问题,在烦请大家给指点一下。程序中的 Me.Picture1.Line (c(1, 1), c(1, 2))-(c(2, 1), c(2, 2)), vbRed
     Me.Picture1.Line (c(2, 1), c(2, 2))-(c(3, 1), c(3, 2)), vbRed
     Me.Picture1.Line (c(3, 1), c(3, 2))-(c(1, 1), c(1, 2)), vbRed
    三条语句怎么没有达到效果,picture1中没有显示这三条线,不知道怎么回事?Private Sub Command1_Click()  Dim a(1 To 3, 1 To 3) As Double
      Dim b(1 To 3, 1 To 3) As Double
    '  Dim c(1 To 3, 1 To 3) As Double
      Dim c() As Double
      Dim xo As Double, tx As Double, ty As Double
      Const PI = 3.14159
      Dim i As Integer, j As Integer, n As Integer
      tx = Val(TxtPX.Text)
      ty = Val(TxtPY.Text)
      
      Me.AutoRedraw = True
      Me.Picture1.AutoRedraw = True
    '显示坐标系(用户自定义)
    Me.Picture1.ScaleMode = 0
    Me.Picture1.Scale (-Me.Picture1.Width / 2, Me.Picture1.Height / 2)-(Me.Picture1.Width / 2, -Me.Picture1.Height / 2)
    Me.Picture1.Line (Me.Picture1.ScaleLeft, 0)-(Me.Picture1.ScaleWidth, 0), vbBlue
    Me.Picture1.Line (0, Me.Picture1.ScaleTop)-(0, Me.Picture1.ScaleHeight), vbBlue'执行变换
    a(1, 1) = Val(TxtAX.Text): a(1, 2) = Val(TxtAY.Text): a(1, 3) = 1
    a(2, 1) = Val(TxtBX.Text): a(2, 2) = Val(TxtBY.Text): a(2, 3) = 1
    a(3, 1) = Val(TxtCX.Text): a(3, 2) = Val(TxtCY.Text): a(3, 3) = 1
    xo = (Val(TxtO.Text) / 180) * PI
    b(1, 1) = 1: b(1, 2) = 0: b(1, 3) = 0
    b(2, 1) = 0: b(2, 2) = 1: b(2, 3) = 0
    b(3, 1) = -tx: b(3, 2) = -ty: b(3, 3) = 1'调用矩阵相乘的函数,完成变换
     c = MatMultiply(a, b) 图形学.AutoRedraw = True
     Me.Picture1.AutoRedraw = True
    '把坐标系转换成X,Y轴正向轴分别为100,100的坐标系
     For i = 1 To 3
        c(i, 1) = c(i, 1) * Me.Picture1.Width / 200
     Next i
     For j = 1 To 3
        c(j, 1) = c(j, 1) * Me.Picture1.Height / 200
     Next j
     Me.Picture1.Line (c(1, 1), c(1, 2))-(c(2, 1), c(2, 2)), vbRed
     Me.Picture1.Line (c(2, 1), c(2, 2))-(c(3, 1), c(3, 2)), vbRed
     Me.Picture1.Line (c(3, 1), c(3, 2))-(c(1, 1), c(1, 2)), vbRedEnd Sub
    '矩阵乘法
      Public Function MatMultiply(x() As Double, y() As Double) As Double()
        Dim n As Integer
        Dim m As Integer
        Dim p As Integer
        Dim i As Integer
        Dim j As Integer
        Dim k As Integer
        Dim z() As Double
        n = UBound(x, 1)    '第一维的上界(即行数)
        m = UBound(x, 2)    '第一维的上界(即列数)
        p = UBound(y, 2)
        ReDim z(1 To n, 1 To p)    If m <> UBound(y, 1) Then
            MsgBox ("这两个矩阵不能相乘!" + Str$(m) + Str$(UBound(y, 1)))
        Else
            For i = 1 To n
                For j = 1 To m
                    For k = 1 To p
                        z(i, k) = z(i, k) + x(i, j) * y(j, k)
                    Next k
                Next j
            Next i
        End If
        MatMultiply = z
    End Function