2016-05-10 1 views
1

序文:キューブ数学を使いこなし、さまざまなオプションを見回した後、私の現在の構造に問題があるようです。多分、誰かが私がここで紛失しているものを指摘するのが好きでしょうか?この場合MMULT()行列の乗算スローSubScriptの範囲外エラー

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 
+1

はそれが '... MMULT(X(A、Bではないでしょう)、y(a、b)) '?しかし、一度に各配列に1つの数値だけを掛けるという事実は、 '= x(a、b)* y(a、b)'で同じ答えを得ることはありませんか? –

+0

@ScottCranerあなたは私が完全にはわからないことを知っています。私はちょうどこれを正直にするのをやめ始めました。私がこれを学ぶのを助けるいくつかの提案があるなら、私はすべての耳の仲間です。 –

+0

私はx(a、b)* y(a、b)がそのトリックをしたと言いますが。 –

答えて

1

それは単一の値の乗算のために作られていない行く方法ではありません。

これは、SUMPRODUCT()と同様の仕組みです。これは、第1配列の行の各項目に、第2配列の列の各項目を掛け合わせるためです。

enter image description here

enter image description here

になりより良い説明のためHEREを参照してください。

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

限り私の研究は、第二に、その姉妹値に1配列内の各値を乗算することが分かっているように:単純な乗算は動作しますので、あなたは、単一の値を乗算している。このコードでは


唯一の方法はループすることです。

これを実行するための最も早い方法が既に使用されています。より大きなデータセットであっても、ワークシート範囲の代わりに配列を使用することにより、これはかなり迅速になります。


あなたが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 
+0

これは技術的に私の質問に答えます。私は別のアプローチをしっかりと続けるつもりです。私は、パフォーマンスの妨げになるかどうかを確かめているので、それぞれのステップを個別に行う必要なしに(Z、X)の行列乗算を簡単に行う方法があります。より大きなデータセットで作業していました。 –

+1

@DougCoatsは編集を参照してください。 –

+1

悪いお尻をしています。私の問題は、1)zパラメータを宣言しようとしました.2)MMULTを正しく実装する方法を正しく理解できていませんでした。そこに私を助けてくれてありがとう! –