gpt4 book ai didi

Excel VBA : Transpose Vector and Matrix Multiply in a function

转载 作者:行者123 更新时间:2023-12-04 22:27:02 25 4
gpt4 key购买 nike

我有一个 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

当我运行它时,我会在工作表中得到#VALUE。我希望输出是一个 1x1 矩阵,但我不知道 Excel VBA 是否会考虑一个可以作为单个值(例如 Double)输出到工作表中的标量。

请发送帮助。

最佳答案

如果您提供了预期的输出(您最终期望的特定标量),那就太好了。

根据我从您的代码和问题中收集到的信息,我假设您正在尝试执行两个步骤。第一个是:

First step

第二个是:

Second step

(我已经有一段时间没有做任何矩阵乘法了,所以如果你认为我误解了,请告诉我。)

您的第一个数组( 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 函数)。

根据我在过去 30 分钟内在线阅读的内容,矩阵乘法不是可交换的,并且还要求第一个矩阵中的列数与第二个矩阵中的行数相匹配。 (您可能已经知道所有这些,但还是要提一下。)

基于以上内容,您的代码可能类似于:
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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com