int DotPowerSpaseByDouble(Sparse* _pSp, Double* _pDouble, InternalType** _pOut) { if (_pDouble->isEmpty()) { //sp .^ [] *_pOut = Double::Empty(); return 0; } size_t iSize = _pSp->nonZeros(); int* Col = new int[iSize]; int* Row = new int[iSize]; _pSp->getColPos(Col); _pSp->getNbItemByRow(Row); int* iPositVal = new int[iSize]; int j = 0; for (int i = 0; i < iSize; j++) { for (int k = 0; k < Row[j]; k++) { iPositVal[i] = (Col[i] - 1) * _pSp->getRows() + j; i++; } } Double** pDbl = new Double*[iSize]; Double** pDblSp = new Double*[iSize]; double* pdbl = _pDouble->get(); if (_pDouble->isScalar()) { if (_pDouble->isComplex()) { double* pdblImg = _pDouble->getImg(); for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[0], pdblImg[0]); pDblSp[i] = new Double(_pSp->get(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } else { for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[0]); pDblSp[i] = new Double(_pSp->getReal(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } } else if (_pDouble->getSize() == iSize) { if (_pDouble->isComplex()) { double* pdblImg = _pDouble->getImg(); for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[i], pdblImg[i]); pDblSp[i] = new Double(_pSp->getReal(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } else { for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[i]); pDblSp[i] = new Double(_pSp->getReal(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } } else { delete[] pDblSp; throw ast::InternalError(_W("Invalid exponent.\n")); return 1; } Sparse* pSpTemp = new Sparse(_pSp->getRows(), _pSp->getCols(), _pSp->isComplex() || _pDouble->isComplex()); pSpTemp->zero_set(); Double* ppDblGet = NULL; for (int i = 0; i < iSize; i++) { if ((pDblSp[i]->get(0) != 0) || (pDblSp[i]->getImg(0) != 0)) { DotPowerDoubleByDouble(pDblSp[i], pDbl[i], &ppDblGet); std::complex<double> cplx(ppDblGet->get(0), ppDblGet->getImg(0)); pSpTemp->set(iPositVal[i], cplx, false); } } delete[] Col; delete[] Row; delete[] iPositVal; pSpTemp->finalize(); *_pOut = pSpTemp; return 0; }
int RDivideSparseByDouble(types::Sparse* _pSp, types::Double* _pDouble, InternalType** _pSpOut) { if (_pDouble->isEmpty()) { //sp / [] *_pSpOut = Double::Empty(); return 0; } if (_pDouble->isIdentity()) { *_pSpOut = new Sparse(*_pSp); return 0; } size_t iSize = _pSp->nonZeros(); int* Col = new int[iSize]; int* Row = new int[_pSp->getRows()]; _pSp->getColPos(Col); _pSp->getNbItemByRow(Row); int* iPositVal = new int[iSize]; int idx = 0; for (int i = 0; i < _pSp->getRows(); i++) { for (int j = 0; j < Row[i]; j++) { iPositVal[idx] = (Col[idx] - 1) * _pSp->getRows() + i; ++idx; } } delete[] Col; delete[] Row; Double** pDbl = new Double*[iSize]; Double** pDblSp = new Double*[iSize]; double* pdbl = _pDouble->get(); if (_pDouble->isScalar()) { if (_pDouble->isComplex()) { double* pdblImg = _pDouble->getImg(); for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[0], pdblImg[0]); pDblSp[i] = new Double(_pSp->get(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } else { for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[0]); pDblSp[i] = new Double(_pSp->getReal(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } } else if (_pDouble->getSize() == iSize) { if (_pDouble->isComplex()) { double* pdblImg = _pDouble->getImg(); for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[i], pdblImg[i]); pDblSp[i] = new Double(_pSp->getReal(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } else { for (int i = 0; i < iSize; i++) { pDbl[i] = new Double(pdbl[i]); pDblSp[i] = new Double(_pSp->getReal(iPositVal[i]), _pSp->getImg(iPositVal[i]).imag()); } } } else { delete[] pDbl; delete[] pDblSp; delete[] iPositVal; return 0; } Sparse* pSpTemp = new Sparse(_pSp->getRows(), _pSp->getCols(), _pSp->isComplex() || _pDouble->isComplex()); pSpTemp->zero_set(); Double* ppDblGet = NULL; int iResultat; for (int i = 0; i < iSize; i++) { if ((pDblSp[i]->get(0) != 0) || (pDblSp[i]->getImg(0) != 0)) { iResultat = RDivideDoubleByDouble(pDblSp[i], pDbl[i], &ppDblGet); if (iResultat != 0) { delete ppDblGet; return iResultat; } std::complex<double> cplx(ppDblGet->get(0), ppDblGet->getImg(0)); pSpTemp->set(iPositVal[i], cplx, false); delete ppDblGet; } } pSpTemp->finalize(); delete[] iPositVal; for (int i = 0; i < iSize; ++i) { delete pDbl[i]; delete pDblSp[i]; } delete[] pDbl; delete[] pDblSp; *_pSpOut = pSpTemp; return 0; }