2

私はこの問題に夢中です。次の乗算から結果を取得できません。

X^t * X

X は、utl_nla_array_dbl データ型で表される m = 36 行 n = 3 列の m * n 行列です。データはテーブルに由来し、単純な pl/sql コードによってコピーされます。

私の問題を解決するために、メソッドutl_nla.blas_gemmを選択しました。これは、行列ベクトル法としての utl_nla.blas_gemv とは対照的に、行列行列法です (私はそれを機能させました。その行列 X をベクトル y で乗算し、正しい結果を受け取ることができました)。

関連するコードは次のとおりです。これは、正しい次元 (3X3) の行列を出力しますが、ゼロだけです。わかりやすくするために、ほとんどのパラメーターをハードコーディングしました。

utl_nla.blas_gemm(
    transa => 'T',
    transb => 'N',
    m => 3,
    n => 3,
    k => 36,
    alpha => 1.0,
    a => X,
    lda => 3,
    b => X,
    ldb => 3,
    beta => 0.0,
    c => XtX,
    ldc => 3);

変数 XtX も utl_nla_array_dbl 型で、結果を保持します。

私が間違っていることは何か分かりますか?私は完全に立ち往生していて、ウェブ上の他の場所で助けを見つけることができないので、すべての貢献に感謝します.

4

2 に答える 2

1

私は同じ問題を抱えていました.数日後、UTL_NLA.BLAS_GEMMプロシージャが壊れていると確信しています. 10.2g バージョンで壊れており、バージョン 11.2g でも同じエラーが発生します。問題は、PL/SQL で記述された in wrapper プロシージャにあります。パラメータ TRANSA、TRANSB の一方または両方が「T」に設定されている場合、パラメータ M、N、K、LDA、LDB、LDC は正しく処理されません。当然のことながら、行列が正方行列の場合、たとえば行列 A が 100x100 で、関連するパラメータ TRANSA = 'T' の場合、機能します。この場合もプロシージャ UTL_NLS.BLAS_GEMM はパラメータを誤って処理しますが、それらは等しいため、効果はありません。私が使用する回避策は簡単です。プロシージャを呼び出す前に、関連する行列を転置し、BLAS_GEMM を常に TRANSA = 'N' に設定して使用します。および TRANSB = 'N' です。残念ながら、UTL_NLA パッケージには転置手続きはありません (ところで、BLAS には転置手続きがあります) が、それを書くことは大したことではありません:

PROCEDURE MatTranspose (nRows IN NUMBER, /* number of rows in A */
                       nCols IN NUMBER, /* number of columns in A */
                       mat_A IN utl_nla_array_dbl, /* supposed it is stored column-wise i.e. 'C' */
                       mat_At IN OUT utl_nla_array_dbl) IS
  /* the array can be larger then nRow * nCol, the rest part is not handled in either matrices */
  nIii   NUMBER;
  nJjj   NUMBER;
BEGIN
  FOR nIii IN 1 .. nRows LOOP                                                                          
     FOR nJjj IN 1 .. nCols LOOP                                                                   
        mat_At (nJjj + nCols * (nIii - 1)) := mat_A (nIii + nRows * (nJjj - 1));
     END LOOP;
  END LOOP;
END MatTranspose;

私にとって本当に苦痛だったのは、e40758.pdf などのドキュメンテーションでした。これも間違いだらけです。232-26 と私を誤解させ、間違ったパラメーターを渡したように思わせます。実際の例を求めて Web を検索するのに数時間を費やしましたが、もちろん無駄でした。これはおそらく BLAS_GEMM 手順の単純なエラーであり、修正に半分の時間がかかりますが、開発者は正しいバージョンを 6 年以上待っています。

于 2013-09-14T19:21:45.320 に答える
0

UTL_NLA の仕様を見て、BLAS_GEMM の説明を読んだ後、LDA と LDB は 36 であるように見えます。それらを変更してみて、それが役立つかどうかを確認してください。

共有してお楽しみください。

于 2010-12-01T12:31:02.010 に答える