/*! * \brief Reading::errorPropagationPolarToCart * Variance propagation to get sigma values for cartesian coordinates * \return */ OiVec Reading::errorPropagationPolarToCart(){ OiVec sigmaCartXyz; OiMat F(3,3); F.setAt(0, 0, qSin(this->rPolar.zenith) * qCos(this->rPolar.azimuth)); F.setAt(0, 1, this->rPolar.distance * qSin(this->rPolar.zenith) * -qSin(this->rPolar.azimuth)); F.setAt(0, 2, this->rPolar.distance * qCos(this->rPolar.zenith) * qCos(this->rPolar.azimuth)); F.setAt(1, 0, qSin(this->rPolar.zenith) * qSin(this->rPolar.azimuth)); F.setAt(1, 1, this->rPolar.distance * qSin(this->rPolar.zenith) * qCos(this->rPolar.azimuth)); F.setAt(1, 2, this->rPolar.distance * qCos(this->rPolar.zenith) * qSin(this->rPolar.azimuth)); F.setAt(2, 0, qCos(this->rPolar.zenith)); F.setAt(2, 1, 0.0); F.setAt(2, 2, this->rPolar.distance * -qSin(this->rPolar.zenith)); OiMat Sll(3,3); Sll.setAt(0, 0, this->rPolar.sigmaDistance * this->rPolar.sigmaDistance); Sll.setAt(1, 1, this->rPolar.sigmaAzimuth * this->rPolar.sigmaAzimuth); Sll.setAt(2, 2, this->rPolar.sigmaZenith * this->rPolar.sigmaZenith); OiMat Qxx = F * Sll * F.t(); //transform Qxx into homogeneous coordinates OiMat Qxx_hc(4,4); for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ Qxx_hc.setAt(i,j, Qxx.getAt(i,j)); } } sigmaCartXyz.add(qSqrt(Qxx.getAt(0,0))); sigmaCartXyz.add(qSqrt(Qxx.getAt(1,1))); sigmaCartXyz.add(qSqrt(Qxx.getAt(2,2))); sigmaCartXyz.add(1.0); if(this->obs != NULL){ this->obs->myStatistic.qxx = Qxx_hc; this->obs->myStatistic.s0_apriori = 1.0; this->obs->myOriginalStatistic = this->obs->myStatistic; } return sigmaCartXyz; }
/*! * \brief OiMat::getCol * Get column vector at the specified position * \param col * \return */ OiVec OiMat::getCol(const int col) const{ OiVec result; if(this->values.size() > 0 && this->values.at(0).size() > col){ for(int i = 0; i < this->values.size(); i++){ result.add(this->values.at(i).at(col)); } }else{ throw runtime_error("Size of matrix less than requested position"); } return result; }