2010-11-29 3 views
2

나는이 문제로 인해 어려움을 겪고 있습니다. I는 다음의 승산의 결과를 얻을 수오라클 데이터베이스와 utl_nla를 사용하여 행렬에 전치 행렬을 곱하는 방법

X^t * X 

X는 m = 36 행와 m의 * N의 행렬이고, n = utl_nla_array_dbl 데이터 형식에 의해 표현되는 3 열. 데이터는 테이블에서 가져와 간단한 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

시도해 주셔서 감사합니다.하지만이 트릭을 수행하지는 않습니다! 대해서는 2를 ZEILE 1 : \t \t \t \t ORA-20005 : 대한 불법 인자 : 매트릭스 (LAST = 108m = 3, N = 36 LDA = 36) 다음 오류 acutally 날 놀랄 않는, throwns를 얻을 \t \t \t \t ORA-06512 "SYS.UTL_NLA"ZEILE 265 \t \t \t \t ORA-06512에서 "SYS.UTL_NLA"에서 ZEILE 6,574 \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을 항상 사용합니다. 는 불행하게도 UTL_NLA 패키지에는 전치 절차가없는 (. BTW 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 년 이상 기다려야합니다.

관련 문제