作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 3x3 矩阵“mat”和一个实数向量“vec”(3x1)我想在 VBA 函数中进行矩阵乘法(在线性代数意义上),如下所示:t(vec)matvec 以产生 1x1 实数我可以在等式中使用。
我不想与函数中的工作表进行交互。矩阵和向量中的值要么是硬编码的,要么是从函数内部计算出来的。应该有一种简单的转置方法,然后像在 MATLAB 或 R 中那样做几个矩阵乘法。这是我到目前为止的位置:
Public Function QuickMaths()
Dim vec As Variant
Dim mat As Variant
mat = Array(Array(1,1+1,3), _
Array(2^2,5,6), _
Array(7,8,9))
vec = Array(2*5,11,12)
QuickMaths = Application.WorksheetFunction.MMult(Application.WorksheetFunction.MMult(Application.WorksheetFunction.Transpose(vec), mat), vec)
End Function
最佳答案
如果您提供了预期的输出(您最终期望的特定标量),那就太好了。
根据我从您的代码和问题中收集到的信息,我假设您正在尝试执行两个步骤。第一个是:
第二个是:
(我已经有一段时间没有做任何矩阵乘法了,所以如果你认为我误解了,请告诉我。)
您的第一个数组( mat
)是数组数组(不是二维数组),我不认为 MMULT
句柄(https://support.office.com/en-us/article/mmult-function-40593ed7-a3cd-4b6b-b9a3-e4ad3c7245eb)。所以你可能需要更换:
mat = Array(Array(1, 1 + 1, 3), _
Array(2 ^ 2, 5, 6), _
Array(7, 8, 9))
ReDim mat(0 To 2, 0 To 2)
mat(0, 0) = 1
mat(0, 1) = 2
mat(0, 2) = 3
mat(1, 0) = 4
mat(1, 1) = 5
mat(1, 2) = 6
mat(2, 0) = 7
mat(2, 1) = 8
mat(2, 2) = 9
FlattenAnArrayOfArrays
函数)。
Option Explicit
Public Function QuickMaths() As Variant
' This function returns a value of type Variant.
' Could return a Long/Double/numeric type; scalar should be at QuickMaths(1,1)
' But MMULT can return non-numeric values, so you risk
' getting a type mismatch error if the matrix multiplication
' is not successful (for whatever reason).
' Maybe this shouldn't be this function's concern -- or maybe it should.
Dim mat As Variant
mat = Array(Array(1, 1 + 1, 3), _
Array(2 ^ 2, 5, 6), _
Array(7, 8, 9))
mat = FlattenAnArrayOfArrays(mat)
Dim vec As Variant
vec = Array(2 * 5, 11, 12)
Dim resultantMatrix As Variant
resultantMatrix = Application.MMult(vec, mat) ' Number of columns in "vec" must match number of rows in "mat"
resultantMatrix = Application.MMult(vec, Application.Transpose(resultantMatrix))
QuickMaths = resultantMatrix
End Function
Private Function FlattenAnArrayOfArrays(ByRef arrayOfArrays As Variant) As Variant()
' Given an array of arrays, returns a two-dimensional array.
' This function is very basic and has no error handling implemented.
Dim firstArray() As Variant
firstArray = arrayOfArrays(LBound(arrayOfArrays)) ' Columns inferred from first array in "arrayOfArrays"
Dim outputArray() As Variant
ReDim outputArray(LBound(arrayOfArrays) To UBound(arrayOfArrays), LBound(firstArray) To UBound(firstArray))
Dim rowIndex As Long
For rowIndex = LBound(outputArray, 1) To UBound(outputArray, 1)
Dim columnIndex As Long
For columnIndex = LBound(outputArray, 2) To UBound(outputArray, 2)
outputArray(rowIndex, columnIndex) = arrayOfArrays(rowIndex)(columnIndex)
Next columnIndex
Next rowIndex
FlattenAnArrayOfArrays = outputArray
End Function
QuickMaths
的返回值函数是一个 1x1 矩阵,但您可以将其分配给单元格的值。 QuickMaths
来自工作表单元格的函数,该单元格将显示返回值(没有任何问题或不需要数组公式)。 关于Excel VBA : Transpose Vector and Matrix Multiply in a function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56910821/
我是一名优秀的程序员,十分优秀!