【问题标题】:EXCEL VBA: Dot Product using ArraysEXCEL VBA:使用数组的点积
【发布时间】:2018-07-19 18:57:24
【问题描述】:

下面是示例代码,它是从更大的整体中摘录的。我正在尝试计算向量betaXtempj 的点积,这应该是一个标量,然后将得到的标量乘以另一个标量Ycoded(j,1)

但是,我在temp1(j,1) 的赋值语句中收到错误消息“类型不匹配”。

选项显式

Sub XX()

    Dim beta As Variant
    Dim temp1 As Variant
    Dim X5 As Variant
    Dim Xtempj As Variant
    Dim Ycoded As Variant

    ReDim beta(1 To 2, 1 To 1)
    ReDim X5(1 To 2, 1 To 2)
    ReDim temp1(1 To 2, 1 To 1)
    ReDim Xtempj(1 To 2, 1 To 1)
    ReDim Ycoded(1 To 2, 1 To 1)

    beta(1, 1) = 0.510825624
    beta(2, 1) = 0

    X5(1, 1) = 1
    X5(1, 2) = 45
    X5(2, 1) = 1
    X5(2, 2) = 76

    Ycoded(1, 1) = 1
    Ycoded(2, 1) = 0

    For j = 1 To 2
        For k = 1 To 2
            Xtempj(k, 1) = X5(j, k)
        Next k

        temp1(j, 1) = WorksheetFunction.MMult(Application.Transpose(beta), Xtempj) * Ycoded(j, 1)

    Next j

End Sub

此错误消息让我认为 VBA 将 Ycoded(j,1) 视为 1 x 1 数组。因此,我也尝试了以下说法:

temp1(j, 1) = WorksheetFunction.MMult(WorksheetFunction.MMult(Application.Transpose(beta), Xtempj), Ycoded(j, 1))

但是,在这里我收到“无法获取 WorksheetFunction 类的 MMult 属性”。

我可以在睡梦中在 R 或 SAS Proc IML 中做这种事情,所以这非常令人沮丧。感谢您提供任何帮助/见解。

最好的,

【问题讨论】:

  • 请声明所有变量以及 X5k 是什么?将 Option Explicit 放在模块顶部(始终、无处不在)
  • X5k 可能会被初始化为 variant/empty,这意味着您的 For k = 1 To X5k 不会发生,并且 Xtempj 不会是您所期望的。
  • 我很抱歉:该声明应改为(例如目的):For k = 1 To 2

标签: excel vba matrix vector linear-algebra


【解决方案1】:

对于显示的部分实例,它被认为是一个正在返回的数组,因此期望您索引到该数组,例如

 temp1(j, 1) =  Ycoded(j, 1) * WorksheetFunction.MMult(Application.Transpose(beta), Xtempj)(1) 

MMULT 否则期望一个数组中的行数相等,而另一个数组中的列数相等。

WorksheetFunction.MMult(Application.Transpose(beta), Xtempj) 正在生成一个变体(1 到 1)。您可以使用 (1) 对其进行索引以访问该值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多