我有同样的问题,几天后,我确定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。 不幸的是,在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。 它也是错误的,例如见p。 232-26,它误导了我,让我觉得我通过了错误的参数。 我花了几个小时在网上搜索一个工作的例子,但是 - 当然 - 徒然。 这可能是BLAS_GEMM过程中的一个简单错误,它需要我们修复一半, ,然而开发人员正在等待6年以上才能获得正确的版本。