2015-10-01 73 views
0

我想創建一個模擬標準Excel MMULT函數來乘法矩陣的函數。我的代碼是:模擬Excel的功能MMULT

Function MatrixMultiplication(Matrix1 As Range, Matrix2 As Range) 
 

 
Dim m1() As Long, m2() As Long, m3() As Long 
 
m1 = Matrix1 
 
m2 = Matrix2 
 

 
If Matrix1 Is Nothing Or Matrix2 Is Nothing Then GoTo Err1 
 
If UBound(m1, 2) <> UBound(m2, 1) Then GoTo Err2 
 

 
ReDim m3(UBound(m1, 1), UBound(m2, 2)) 
 

 
For i = LBound(m1) To UBound(m1, 1) 
 
    For j = LBound(m2) To UBound(m1, 2) 
 
     For k = 1 To UBound(m1, 2) 
 
     m3(i, j) = m3(i,j)+ m1(i, k) * m2(k, i) 
 
     Next k 
 
    Next j 
 
Next i 
 

 
Dim Matrix3 As Range 
 

 
Set Matrix3 = Range(ActiveCell.Address, ActiveCell.Offset(UBound(m1, 1) - 1, UBound(m2, 2) - 1)) 
 

 
Matrix3 = m3 
 

 
Set MatrixMultiplication = Matrix3 
 

 
Err1: 
 
    Selection.Cells(0, 0).Value = CVErr(xlErrNull) 
 
Err2: 
 
    Selection.Cells(0, 0).Value = CVErr(xlErrNA) 
 

 
End Function

不知怎的,這是行不通的。它應該作爲CSE功能。謝謝你的幫助。

+1

編寫一個函數需要兩個變體並返回一個變體會更有意義。你爲什麼想要返回一個範圍而不是一個變體? –

+0

但是,如果我返回變體,它會像MMULT一樣工作嗎?我的意思是CSE公式? – luka5z

+0

是的 - 會的。如果返回一個變體(包含一個數組),那麼該數組可以返回爲用作數組公式的值作爲數組公式 –

回答

2

這是一個有效的版本。有點微妙的一點是,如果你傳遞它在範圍內給出的數組,那麼你需要將它們轉換爲常規數組。注意兩條線附近的函數的開頭是這樣做:

Function MatrixProduct(A As Variant, B As Variant) As Variant 
    'Assumes that A,B are 1-based variant arrays 
    'Or ranges containing such things. 
    'Little error checking is done 

    Dim m As Long, n As Long, p As Long, i As Long, j As Long, k As Long 
    Dim C As Variant 

    If TypeName(A) = "Range" Then A = A.Value 
    If TypeName(B) = "Range" Then B = B.Value 
    m = UBound(A, 1) 
    p = UBound(A, 2) 
    If UBound(B, 1) <> p Then 
     MatrixProduct = "Not Defined!" 
     Exit Function 
    End If 
    n = UBound(B, 2) 

    ReDim C(1 To m, 1 To n) 
    For i = 1 To m 
     For j = 1 To n 
      For k = 1 To p 
       C(i, j) = C(i, j) + A(i, k) * B(k, j) 
      Next k 
     Next j 
    Next i 
    MatrixProduct = C 
End Function 

這可以直接在電子表格中使用,也可以在VBA代碼直接使用。它幾乎肯定比內置的MMULT慢,所以我不太確定它是多麼有用。

+0

非常感謝!這只是爲了自我學習的目的。我知道它必須比MMULT更sl er – luka5z