非常大的三维数组的“内存不足”错误

问题描述 投票:0回答:1

我试图填充,然后基于一个相当大的数组执行计算。这是为了填充二叉树来计算期权价格,所以在填充数组后我需要执行重复计算,所以我更喜欢在我的数组中有3个维度,以便在代码中进一步简化参考。第一个维度是已经过的期数,第二个维度是价格上涨的数量,第三个维度是价格下降的数量。

Dim arr() As Double
Dim periods As Integer
Dim p As Long, i As Long
Dim u As Double, d As Double
Dim iniprice As Double

Let periods = 400
Let iniprice = 100
Let u = 1.1
Let d = 0.9

ReDim arr(0 To periods, 0 To periods, 0 To periods)

Let arr(0, 0, 0) = iniprice

For p = 1 To UBound(arr, 1)
  For i = 0 To p
    arr(p, i, p - i) = WorksheetFunction.RoundDown(arr(0, 0, 0) * u ^ i * d ^ (p - i), 2)
  Next i
Next p

这是一个限制源于我的PC上可用的RAM量(目前有8Gb),还是VBA本身的限制?由于一个期间通常是一天,因此期间值1000是正常的(252天= 1个交易年)。

我还注意到我有很多未使用的值,因为我只想填充具有此格式arr(p,i,pi)的值,诸如arr(10,10,10)之类的值将为0.我想非常感谢对此的解决方法。

vba
1个回答
1
投票

您可以尝试使用单个查找列来表示3D阵列(不是最好的方法,但有助于解决内存错误):

Dim periods As Integer
Dim p As Long, i As Long
Dim u As Double, d As Double
Dim iniprice As Double
Dim d1 As Long, d2 As Long, d3 As Long, someRow As Long
Dim fndRange As Range

Let periods = 400
Let iniprice = 100
Let u = 1.1
Let d = 0.9

' Col A will be your lookup in format "X-X-X", Col B will hold values
With Sheets("some sheet")
    .Range("B1") = iniprice
    For d1 = 0 To periods
        For d2 = 0 To periods
            For d3 = 0 To periods
                .Range("A" & someRow).Value = d1 & "-" & d2 & "-" & d3
                someRow = someRow + 1
            Next
        Next
    Next
End With

For p = 1 To periods
    For i = 0 To p
        Set fndRange = Sheets("some sheet").Columns(1).Find(p & "-" & i & "-" & (p-1))
        fndRange.Offset(0,1).Value = WorksheetFunction.RoundDown(iniprice * u ^ i * d ^ (p - i), 2)
    Next i
Next p
© www.soinside.com 2019 - 2024. All rights reserved.