2010-11-29 3 views
2

私はこの問題を抱えています。私は、次の乗算の結果を得ることができない。Oracleデータベースとutl_nlaを使用して転置行列に掛け算を行う方法

X^t * X 

Xがm = 36行n = utl_nla_array_dblデータ型で表される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でもあり、その結果を保持することです。

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

答えて

0

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

共有して楽しんでください。

+0

試していただきありがとうございますが、これはトリックを行うことはありません! 次のエラーがacutally私驚きないthrowns、取得:Zeile 1 FEHLER:\t \t \t \t ORA-20005:のための不正な引数:マトリックス(LAST = 108メートル= 3 N = 36 LDA = 36) \t \t \t \t ORA-06512: "SYS.UTL_NLA"、Zeile 265 \t \t \t \t ORA-06512で "SYS.UTL_NLA" で、Zeile 6574 \t \t \t \t ORA-06512:Zeile 77に\t \t \t \t 他にもありますか? – Toby

1

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

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。 あまりにも間違いがあります。例えばpを見てください。私が誤ったパラメータを渡したと思うようになります。 私は実際の例をWebで検索するのに2,3時間を費やしましたが、もちろん - 無駄でした。 おそらくBLAS_GEMMプロシージャの単純なエラーです。修正するには半分の時間がかかりますが、 ですが、開発者は正しいバージョンで6年以上待っています。

関連する問題