func zgelsHelper(m, n, nrhs int, a []complex128, lda int, b []complex128, ldb int, work []complex128, lwork int) error { var ( trans_ = conjTransChar(false) m_ = C.integer(m) n_ = C.integer(n) nrhs_ = C.integer(nrhs) a_ = ptrComplex128(a) lda_ = C.integer(lda) b_ = ptrComplex128(b) ldb_ = C.integer(ldb) work_ = ptrComplex128(work) lwork_ = C.integer(lwork) ) var info_ C.integer C.zgels_(&trans_, &m_, &n_, &nrhs_, a_, &lda_, b_, &ldb_, work_, &lwork_, &info_) info := int(info_) switch { case info < 0: return errInvalidArg(-info) case info > 0: return errNotFullRank(info) default: return nil } }
// void zgels_(char *trans, int *m, int *n, int *nrhs, complex *a, int *lda, // complex *b, int *ldb, complex *work, int *lwork, int *info); func zgels(trans string, M, N, NRHS int, A []complex128, lda int, B []complex128, ldb int) int { var info int = 0 var lwork int = -1 var work complex128 ctrans := C.CString(trans) defer C.free(unsafe.Pointer(ctrans)) // calculate work buffer size C.zgels_( ctrans, (*C.int)(unsafe.Pointer(&M)), (*C.int)(unsafe.Pointer(&N)), (*C.int)(unsafe.Pointer(&NRHS)), nil, (*C.int)(unsafe.Pointer(&lda)), nil, (*C.int)(unsafe.Pointer(&ldb)), unsafe.Pointer(&work), (*C.int)(unsafe.Pointer(&lwork)), (*C.int)(unsafe.Pointer(&info))) lwork = int(real(work)) wbuf := make([]complex128, lwork) C.zgels_( ctrans, (*C.int)(unsafe.Pointer(&M)), (*C.int)(unsafe.Pointer(&N)), (*C.int)(unsafe.Pointer(&NRHS)), unsafe.Pointer(&A[0]), (*C.int)(unsafe.Pointer(&lda)), unsafe.Pointer(&B[0]), (*C.int)(unsafe.Pointer(&ldb)), unsafe.Pointer(&wbuf[0]), (*C.int)(unsafe.Pointer(&lwork)), (*C.int)(unsafe.Pointer(&info))) return info }