【问题标题】:Matrix Multiplication Throwing SubScript Out of Range Error矩阵乘法抛出下标超出范围错误
【发布时间】:2016-05-10 18:12:46
【问题描述】:

前言:搞砸了立方体数学,在环顾了所有各种选项之后,我似乎遇到了我当前结构的问题。也许有人愿意指出我在这里缺少什么?

Private Sub cube3()
    Dim x(0 To 2, 0 To 2) As Single
    Dim y(0 To 2, 0 To 2) As Single
    Dim z(0 To 2, 0 To 2) As Single
    For a = 0 To 2
        For b = 0 To 2
            Count = (Count + 3) / 2 * 1.5
            x(a, b) = Count
            y(a, b) = Count
            z(a, b) = Application.WorksheetFunction.MMult(x, y)(a, b) '****** This is where the issue occurs
            Debug.Print ; x(a, b)
            Debug.Print ; z(a, b)
        Next
    Next
End Sub

【问题讨论】:

  • 不会是...MMult(x(a,b),y(a, b))吗?但是,您一次只在每个数组中乘以一个数字,= x(a,b)*y(a, b) 不会得到相同的答案吗?
  • @ScottCraner 你知道我不完全确定。老实说,我刚开始搞砸这个。如果您有一些建议可以帮助我了解这一点,我会全力以赴。
  • 虽然我会说 x(a,b)*y(a,b) 成功了。
  • 如果你想作为答案发布,我会给你你应得的反馈......除非你真的想详细说明我可能想知道的事情:D
  • 我们说话的时候我正在玩它。我不使用 MMULT() 函数并试图理解它。

标签: vba excel matrix-multiplication


【解决方案1】:

在这种情况下,MMULT() 不是可行的方法,它不是为单值乘法而设计的。

它系统地做一些类似于 SUMPRODUCT() 的事情。因为它将第一个数组中一行中的每个项目与第二个数组中一列中的每个项目相乘。

变成

请参阅HERE 以获得更好的解释。


在此代码中,您将单个值相乘,因此可以进行简单的乘法运算:

= x(a,b)*y(a, b)

据我的研究发现,将一个数组中的每个值与第二个数组中的姊妹值相乘,唯一的方法就是循环。

您已经在使用最快的方法来执行此操作。通过使用数组而不是工作表范围,即使有更大的数据集,这仍然会很快。


如果你想使用 MMULT() 则先填充两个数组并将 z 声明为变体:

Private Sub cube3()
Dim x(0 To 2, 0 To 2) As Single
Dim y(0 To 2, 0 To 2) As Single
Dim z
For a = 0 To 2
    For b = 0 To 2
        Count = (Count + 3) / 2 * 1.5
        x(a, b) = Count
        y(a, b) = Count

        Debug.Print x(a, b)
        Debug.Print y(a, b)
    Next
Next
 z = Application.WorksheetFunction.MMult(x(), y()) '****** This is where the issue occurs
 Range("A1").Resize(UBound(z, 1), UBound(z, 2)).Value = z
End Sub

【讨论】:

  • 这在技术上确实回答了我的问题。我将继续使用不同的方法,因为我确信有一种更简单的方法可以用 (x,y) 的矩阵乘法填充“Z”,而不必单独执行每个步骤,因为我很确定如果我这样做会阻碍性能正在处理更大的数据集。
  • 真是个混蛋。我的问题是 1)试图声明 z 参数和 2)对如何正确实现 MMULT 的理解不当。谢谢你帮助我!
  • @DougCoats 感谢您找到可以让我学到新东西的东西。
  • 很高兴我能帮上忙:D
  • @DougCoats 如果您可以摆脱大量负载,那么就这样做。切勿使用来自连续工作表范围的值填充数组。批量加载z=Range("A1:D20").Value 将 z 声明为变体,否则它会抛出错误并意识到 z 将以 1 为底而不是 0。但是通过循环从数组中加载数组确实不需要那么长时间。我已经完成了超过 50,000 次循环来从其他具有大量逻辑的数组中加载数组,这需要一两秒钟,而使用工作表范围则需要 30 到 40 分钟。
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 2015-06-03
  • 2015-05-27
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
相关资源
最近更新 更多