2

我要疯了这个问题。我无法从以下乘法中得到结果:

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 类型,用于保存结果。

知道我做错了什么吗?我会感谢每一个贡献,因为我完全陷入困境并且无法在网络上的其他地方找到任何帮助。

4

2 回答 2

1

我遇到了同样的问题,几天后我确定 UTL_NLA.BLAS_GEMM 程序已损坏。它在10.2g版本中被破坏了,在11.2g版本中仍然出现同样的错误。问题出在用 PL/SQL 编写的包装过程中。在参数 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。它也充满了错误,例如见 p。232-26 它误导了我,让我认为我传递了错误的参数。我花了几个小时在网上搜索一个可行的例子,但 - 当然 - 徒劳无功。这可能是 BLAS_GEMM 程序中的一个简单错误,需要一半的时间才能修复,但开发人员要等待 6 年以上才能找到正确的版本。

于 2013-09-14T19:21:45.320 回答
0

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

分享和享受。

于 2010-12-01T12:31:02.010 回答