void SylvMatrix::multLeft(int zero_cols, const GeneralMatrix& a, const GeneralMatrix& b) { int off = a.numRows() - a.numCols(); if (off < 0 || a.numRows() != rows || off != zero_cols || rows != b.numRows() || cols != b.numCols()) { throw SYLV_MES_EXCEPTION("Wrong matrix dimensions for multLeft."); } // here we cannot call SylvMatrix::gemm since it would require // another copy of (usually big) b (we are not able to do inplace // submatrix of const GeneralMatrix) if (a.getLD() > 0 && ld > 0) { blas_int mm = a.numRows(); blas_int nn = cols; blas_int kk = a.numCols(); double alpha = 1.0; blas_int lda = a.getLD(); blas_int ldb = ld; double beta = 0.0; blas_int ldc = ld; dgemm("N", "N", &mm, &nn, &kk, &alpha, a.getData().base(), &lda, b.getData().base()+off, &ldb, &beta, data.base(), &ldc); } }
Vector::Vector(int row, GeneralMatrix& m) : len(m.numCols()), s(m.getLD()), data(&(m.get(row, 0))), destroy(false) { }