web-dev-qa-db-ja.com

ReDim Preserve "Subscript Out of Range"

2つのダブルアレイから2つの異なるダブルアレイにデータを移動しようとしています。最初の配列からランダム化されたサンプルを取り出して2番目の配列に入れているので、サイズがどうなるかわかりません。

ReDim Preserve行を追加すると、Subscript Out of Rangeエラーが発生します。

Function CreateTrainingSet(TrainingPercent As Double, Inputs() As Double, Outputs() As Double)
 ' Create Randomized Training set data
 Dim TrainingInputs() As Double, TrainingOutputs() As Double
 Dim i As Integer, j As Integer, count As Integer
 'ReDim TrainingInputs(UBound(Inputs, 1), UBound(Inputs, 2))
 'ReDim TrainingOutputs(UBound(Outputs, 1), UBound(Outputs, 2))
 count = 0

 ' Move TraningPercent % of data from Inputs and Outputs to TrainingInputs and TrainingOutputs
 For i = LBound(Inputs, 1) To UBound(Inputs, 1)
  Dim ran As Double
  ran = Rnd()
  If ran <= TrainingPercent Then
   count = count + 1
   For j = LBound(Inputs, 2) To UBound(Inputs, 2)
    ReDim Preserve TrainingInputs(1 To count, 1 To UBound(Inputs, 2))
    TrainingInputs(count, j) = Inputs(i, j)
   Next j
   For j = LBound(Outputs, 2) To UBound(Outputs, 2)
    ReDim Preserve TrainingOutputs(1 To count, 1 To UBound(Outputs, 2))
    TrainingOutputs(count, j) = Outputs(i, j)
   Next j
  End If
 Next i

 For i = LBound(TrainingInputs, 1) To UBound(TrainingInputs, 1)
  For j = LBound(TrainingInputs, 2) To UBound(TrainingInputs, 2)
   Cells(i, j + 10).Value = TrainingInputs(i, j)
  Next j
 Next i


End Function
10
atomant

上記のコメントを回答に要約するには:

  • 多次元配列の最後の次元のみを使用できます

したがって、多次元配列のサイズを変更するには、いくつかの簡単なオプションがあります。

  1. サイズを1つだけ変更する必要がある場合は、ループとロジックを反転させて、サイズを変更するディメンションが最後のディメンションになるようにします。
  2. 両方の次元のサイズを変更する必要がある場合は、配列の配列または配列のコレクションを使用し、必要に応じてループを修正してください
23
Carl Onager