У меня была такая же проблема, и через несколько дней я уверен, что процедура UTL_NLA.BLAS_GEMM не работает.Он был сломан в версии 10.2g, но такая же ошибка возникает в версии 11.2g.Проблема в процедуре in wrapper, написанной на PL / SQL.Он не обрабатывает параметры M, N, K, LDA, LDB, LDC правильно, в случае, если один или оба параметра TRANSA, TRANSB установлены в «T».Не удивительно, что это работает, когда матрица представляет собой квадратную матрицу, например, матрица 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,Он также полон ошибок, см., Например, стр.232-26, и это вводит меня в заблуждение, заставляет меня думать, что я передаю неправильные параметры.Я потратил пару часов на поиск в Интернете рабочего примера, но, конечно, напрасно.Вероятно, это простая ошибка в процедуре BLAS_GEMM, на исправление которой уходит половина нашего кода, и все же разработчики ждут правильной версии более 6 лет.