Ошибка «Недостаточно памяти» для очень большого трехмерного массива - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь заполнить, а затем выполнить вычисления на основе довольно большого массива. Это необходимо для заполнения биномиального дерева для расчета цены опциона, поэтому после заполнения массива мне нужно будет выполнить повторное вычисление, поэтому я бы предпочел иметь 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

Это ограничение связано с объемом оперативной памяти, доступной на моем ПК (в настоящее время имеет 8 ГБ), или это ограничение самого VBA? Поскольку один период обычно равен одному дню, значение периодов 1000 является нормальным (252 дня = 1 торговый год).

Я также заметил, что у меня много неиспользуемых значений, потому что я хочу заполнить только значения, имеющие этот формат arr (p, i, pi), такие значения, как arr (10,10,10), будут равны 0. Я был бы очень признателен, если бы обойти это.

1 Ответ

0 голосов
/ 17 сентября 2018

Вы можете попробовать использовать один столбец поиска для представления трехмерного массива (не лучший способ, но помогает с ошибками памяти):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...