如何使用Oracle数据库和utl_nla将矩阵与其转置相乘

时间:2010-11-29 16:45:13

标签: sql oracle plsql linear-algebra blas

我对此问题感到困惑。我无法从以下乘法得到结果:

X^t * X

X是m * n矩阵,m = 36行,n = 3列,由utl_nla_array_dbl数据类型表示。数据来自表,并通过简单的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类型,用于保存结果。

知道我做错了什么吗?我会感激所有的贡献,因为我完全陷入困境,在网上其他地方找不到任何帮助。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,几天之后我确信,UTL_NLA.BLAS_GEMM程序已经破了。 它在10.2g版本中被破坏,在版本11.2g中仍然出现相同的错误。 问题出在用PL / SQL编写的包装程序中。 它不处理参数 M,N,K,LDA,LDB,LDC正确, 在一个或两个参数TRANSA,TRANSB被设置为'T'的情况下。 当矩阵是sqare矩阵时,毫不奇怪它是有效的, 例如,矩阵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。 它也充满了错误,例如参见p。 232-26它误导我,让我觉得我传递了错误的参数。 我花了几个小时在网上搜索一个有效的例子,但是 - 当然 - 徒劳无功。 这可能是BLAS_GEMM过程中的一个简单错误,需要修复一半, 然而开发人员正在等待超过6年的正确版本。

答案 1 :(得分:0)

在查看UTL_NLA的规范并阅读BLAS_GEMM的描述后,我认为LDA和LDB应该是36.尝试更改它们并查看它是否有帮助。

分享并享受。