VBA:matrix逆

我试图做一些简单的事情:在单元格A1:C3中取一个matrix,并将单元格写入单元格E1:G3。 这不起作用,我得到的错误是“types不匹配”。 为什么?

Sub f() Range("E1:G3").Value = g(Range("A1:C3")) End Sub Function g(m As Range) As Double() Dim r As Integer, c As Integer Dim minv() As Double r = m.Rows.Count c = m.Columns.Count ReDim minv(1 To r, 1 To c) minv = WorksheetFunction.MInverse(m) g = minv End Function 

WorksheetFunction.MInverse返回一个Variant其中包含matrix不是Double数组。 https://msdn.microsoft.com/en-us/library/office/ff841265.aspx所以Double数组和ReDim是没有必要的。

但是还有另一个问题。 并非所有的matrix都是可逆的。 使用不可逆matrixWorksheetFunction.MInverse将引发错误。 最好使用Application.MInverse 。 这将返回#NUM! 错误=MINV()也会这样做。

 Sub f() Range("E1:G3").Value = g(Range("A1:C3")) End Sub Function g(m As Range) As Variant Dim minv As Variant minv = Application.MInverse(m) g = minv End Function 

如果函数必须返回一个Double()数组,那么你必须把Variant转换成那个。

 Function g(m As Range) As Double() Dim vMinv As Variant Dim dMinv() As Double vMinv = Application.MInverse(m) If IsError(vMinv) Then Exit Function 'what shall the Double() contain if m is not invertable? On Error Resume Next d1 = UBound(vMinv, 1) d2 = UBound(vMinv, 2) On Error GoTo 0 'vMinv is one-dimensional If IsEmpty(d2) Then ReDim dMinv(1 To d1) For i = 1 To d1 dMinv(i) = vMinv(i) Next g = dMinv Exit Function End If 'vMinv is two-dimensional ReDim dMinv(1 To d1, 1 To d2) For i = 1 To d1 For j = 1 To d2 dMinv(i, j) = vMinv(i, j) Next Next g = dMinv End Function 

但问题是:如果m不是可逆的,Double()包含什么? 它不能包含错误值。