代码之家  ›  专栏  ›  技术社区  ›  JvdV

将1D数组乘以1D数组或常数-VBA

  •  0
  • JvdV  · 技术社区  · 6 年前

    Q&A-style .如果总的意见是这样的,这将是离题的,我很乐意删除,如果需要的话。

    背景:

    我一直在想,如果将另一个1D数组乘以一个常量值或第三个1D数组(大小相同),是否可以返回一个1D数组 没有

    因此,我正在寻找的过程如下所示:

    • 乘以常数>得到 {3,6,9} 直接来自 {1,2,3}*3
    • {3,8,15} {1,2,3}*{3,4,5}

    我已经看到了关于这个主题的问题,但是我还没有看到一个不经过迭代就能做到这一点的答案。我所见过的最近的一次是在一条公路上的@SiddharthRout external 论坛

    • 乘以常数

    Sub Test()
        
        Dim arr1 As Variant: arr1 = Array(1,2,3)
        Dim y As Long, x As Long: x = 3 'Our constant
        
        For y = LBound(arr1) To UBound(arr1)
            arr1(y) = arr1(y) * x
        Next y
        
        End Sub
    • 乘数组

    Sub Test()
    
    Dim arr1 As Variant: arr1 = Array(1, 2, 3)
    Dim arr2 As Variant: arr2 = Array(3, 4, 5)
    Dim y As Long
    
    For y = LBound(arr1) To UBound(arr1)
        arr1(y) = arr1(y) * arr2(y)
    Next y
    
    End Sub

    如何在不进行迭代的情况下,将另一个1D数组乘以任何常数或另一个(大小相同)1D数组来检索1D数组?

    1 回复  |  直到 6 年前
        1
  •  0
  •   JvdV    6 年前

    到目前为止,我发现答案的关键在于 MMULT ,将行*列相乘返回数组。


    Sub Multiply_1D_byConstant()
    
    Dim arr1 As Variant: arr1 = Array(1, 4, 3, 5, 10, 15, 13, 11, 6, 9)
    
    With Application
    
        Dim x As Long: x = 3 'Our constant
        Dim y As Long: y = UBound(arr1) + 1
    
        Dim arr2 As Variant: arr2 = .Evaluate("TRANSPOSE(ROW(" & x + 1 & ":" & x + y + 1 & ")-ROW(1:" & y + 1 & "))")
        Dim arr3 As Variant: arr3 = .Evaluate("TRANSPOSE(ROW(1:" & y & "))")
        Dim arr4 As Variant: arr4 = .Index(.MMult(.Transpose(arr1), arr2), arr3, 1)
    
    End With
    
    End Sub
    

    在这里 .Evaluate Ubound(arr1)+1 .在上述情况下: {3,3,3,3,3,3,3,3,3,3}

    .Transpose arr1在我们的 .MMult(.Transpose(arr1), arr2) .Index 。上述结果将是:

    {3, 12, 9, 15, 30, 45, 39, 33, 18, 27}

    .MMult

    enter image description here

    然后,因为我们基本上给 指数 阵列状 {1,2,3,4,5,6,7,8,9,10} ,但以动态方式,对于行,第一列仅为1, 指数

    enter image description here


    将一维数组乘以一维数组

    这也会起同样的作用。让我们想象一下下面的情景:

    Sub Multiply_1D_by1D()
    
    Dim arr1 As Variant: arr1 = Array(1, 4, 3, 5, 10, 15, 13, 11, 6, 9)
    Dim arr2 As Variant: arr2 = Array(2, 1, 4, 1, 2, 3, 2, 5, 2, 1)
    
    With Application
    
        Dim y As Long: y = UBound(arr1) + 1
        Dim arr3 As Variant: arr3 = .Evaluate("TRANSPOSE(ROW(1:" & y & "))")
        Dim arr4 As Variant: arr4 = .Index(.MMult(.Transpose(arr1), arr2), arr3, arr3)
    
    End With
    
    End Sub
    

    这次我们不说了 指数 .MMult 估计 动态返回数组。因此,上面返回一个1D数组,如:

    {2, 4, 12, 5, 20, 45, 26, 55, 12, 9}

    将从上面的示例中返回2D数组,如下所示:

    enter image description here

    然后,因为我们基本上给 两个数组相似 {1,2,3,4,5,6,7,8,9,10} ,但以动态的方式, 将从该二维阵列中切片一个一维阵列:

    enter image description here


    以同样的方式,您可以使用 指数 只要使用有效的1D数组指定rows和columns参数。我希望这对任何人都有帮助。

    推荐文章