Пример #1
0
void ZOHTest::testMatrixExp1()
{
  std::cout << "===========================================" <<std::endl;
  std::cout << " ===== ZOH tests start ... ===== " <<std::endl;
  std::cout << "===========================================" <<std::endl;
  std::cout << "------- Compute matrix exponential of a upper triangular matrix -------" <<std::endl;
  _A->zero();
  (*_A)(0, 1) = 1;
  init();
  _sim->computeOneStep();
  _sim->nextStep();
  SP::SimpleMatrix tmpM(new SimpleMatrix(_n, _n, 0));
  tmpM->eye();
  (*tmpM)(0, 1) = _h;
  const SimpleMatrix& Phi = _ZOH->Ad(_DS);
  CPPUNIT_ASSERT_EQUAL_MESSAGE("testMatrixExp1 : ", Phi.size(0) == _n, true);
  CPPUNIT_ASSERT_EQUAL_MESSAGE("testMatrixExp1 : ", Phi.size(1) == _n, true);
  CPPUNIT_ASSERT_EQUAL_MESSAGE("testMatrixExp1 : ", (*tmpM - Phi).normInf() < _tol, true);
  std::cout << "------- Second computation ok, error = " << (*tmpM - Phi).normInf() << " -------" <<std::endl;
  std::cout <<std::endl <<std::endl;
}
Пример #2
0
void ZOHTest::testMatrixExp0()
{
  std::cout << "===========================================" <<std::endl;
  std::cout << " ===== ZOH tests start ... ===== " <<std::endl;
  std::cout << "===========================================" <<std::endl;
  std::cout << "------- Compute matrix exponential of the identity matrix -------" <<std::endl;
  _A->eye();
  init();
  _sim->computeOneStep();
  _sim->nextStep();
  SP::SimpleMatrix tmpM(new SimpleMatrix(_n, _n, 0));
  tmpM->eye();
  *tmpM = (*tmpM) * exp(_h);
  const SimpleMatrix& Phi = _ZOH->Ad(_DS);
  CPPUNIT_ASSERT_EQUAL_MESSAGE("testMatrixExp0 : ", Phi.size(0) == _n, true);
  CPPUNIT_ASSERT_EQUAL_MESSAGE("testMatrixExp0 : ", Phi.size(1) == _n, true);
  double diff = (*tmpM - Phi).normInf();
  CPPUNIT_ASSERT_EQUAL_MESSAGE("testMatrixExp0 : ", diff < _tol, true);
  std::cout << "------- First computation ok, error = " << diff << " -------" <<std::endl;
  std::cout <<std::endl <<std::endl;
}
Пример #3
0
    void calcAndResetEmissions(SeqData const & seqData, Grammar & g, EmitWrappers & ew, EmitAnnoMap & eam, string const & annoName)
    {
      // mk emissions
      unsigned n = seqData.seqSize();
      xvector_t tmpV(n);
      reset(tmpV);
      vector<xvector_t> vv(ew.vecWrapNames().size(), tmpV);
      ew.vectorEmissions(vv, seqData);
      
      xmatrix_t tmpM(n, n);
      reset(tmpM);
      vector<xmatrix_t> vm(ew.matWrapNames().size(), tmpM);
      ew.matrixEmissions(vm, seqData);
      
      // mask according to anno
      if ( eam.size() and annoName.size() ) {
	string const & anno = seqData.getAnno(annoName);
	maskEmissions(vv, ew.vecWrapNames(), anno, eam);
	maskEmissions(vm, ew.matWrapNames(), anno, eam);
      }
      
      g.resetEmissions(vv, vm);
    }
void GFilter::InitiateGuidance( const cv::Mat_<cv::Vec3b> &gImg, int radius, float epsl )
{
	cv::Mat_<float> varIBB, varIBG, varIBR, varIGG, varIGR, varIRR;
	cv::Mat_<float> mIBB, mIBG, mIBR, mIGG, mIGR, mIRR;

	int height, width;
	height = gImg.rows;
	width = gImg.cols;

	cv::Mat gArr[3];
	cv::split(gImg, gArr);
	gArr[0].convertTo(iB, CV_32FC1, 1/255.0f);
	gArr[1].convertTo(iG, CV_32FC1, 1/255.0f);
	gArr[2].convertTo(iR, CV_32FC1, 1/255.0f);

	// window normalize size
	normWin.create(height, width);
	normWin.setTo(1.0);
	TheBoxFilter(normWin, normWin, radius);

	// mean of guidance image I
	TheBoxFilter(iB, mIB, radius);
	TheBoxFilter(iG, mIG, radius);
	TheBoxFilter(iR, mIR, radius);

	mIB /= normWin;
	mIG /= normWin;
	mIR /= normWin;

	// variance of guidance image I
	TheBoxFilter(iB.mul(iB), mIBB, radius);
	TheBoxFilter(iB.mul(iG), mIBG, radius);
	TheBoxFilter(iB.mul(iR), mIBR, radius);
	TheBoxFilter(iG.mul(iG), mIGG, radius);
	TheBoxFilter(iG.mul(iR), mIGR, radius);
	TheBoxFilter(iR.mul(iR), mIRR, radius);

	mIBB /= normWin;
	mIBG /= normWin;
	mIBR /= normWin;
	mIGG /= normWin;
	mIGR /= normWin;
	mIRR /= normWin;

	varIBB = mIBB - mIB.mul(mIB);
	varIBG = mIBG - mIB.mul(mIG);
	varIBR = mIBR - mIB.mul(mIR);
	varIGG = mIGG - mIG.mul(mIG);
	varIGR = mIGR - mIG.mul(mIR);
	varIRR = mIRR - mIR.mul(mIR);

	// calculate inverse
	int iy, ix;
	//invIU.create(height, width);			
	invIU.resize(height);
	cv::Matx33f epsU(
		epsl, 0.0, 0.0,
		0.0, epsl, 0.0,
		0.0, 0.0, epsl);
	for (iy=0; iy<height; ++iy)
	{
		invIU[iy].resize(width);
		for (ix=0; ix<width; ++ix)
		{
			//printf("0: %d %d\n", iy, ix);
			cv::Matx33f tmpM(
				varIBB[iy][ix], varIBG[iy][ix], varIBR[iy][ix],
				varIBG[iy][ix], varIGG[iy][ix], varIGR[iy][ix],
				varIBR[iy][ix], varIGR[iy][ix], varIRR[iy][ix]);
				

			invIU[iy][ix] = (tmpM+epsU).inv();
			//invIU(iy, ix) = epsU.inv();
			//printf("%d %d %d %d\n", iy, ix, invIU.rows, invIU.cols);
			//invIU[iy][ix] = epsU.inv();
		}
	}
}
void GFilter::InitiateGuidance( const cv::Mat_<cv::Vec3f> &gImg, int radius, float epsl )
{
	cv::Mat_<float> varIBB, varIBG, varIBR, varIGG, varIGR, varIRR;
	cv::Mat_<float> mIBB, mIBG, mIBR, mIGG, mIGR, mIRR;

	int height, width;
	height = gImg.rows;
	width = gImg.cols;

	cv::Mat gArr[3];
	cv::split(gImg, gArr);
	gArr[0].convertTo(iB, CV_32FC1, 1/255.0f);
	gArr[1].convertTo(iG, CV_32FC1, 1/255.0f);
	gArr[2].convertTo(iR, CV_32FC1, 1/255.0f);

	// window normalize size
	normWin.create(height, width);
	normWin.setTo(1.0);
	TheBoxFilter(normWin, normWin, radius);

	// mean of guidance image I
	TheBoxFilter(iB, mIB, radius);
	TheBoxFilter(iG, mIG, radius);
	TheBoxFilter(iR, mIR, radius);

	mIB /= normWin;
	mIG /= normWin;
	mIR /= normWin;

	// variance of guidance image I
	TheBoxFilter(iB.mul(iB), mIBB, radius);
	TheBoxFilter(iB.mul(iG), mIBG, radius);
	TheBoxFilter(iB.mul(iR), mIBR, radius);
	TheBoxFilter(iG.mul(iG), mIGG, radius);
	TheBoxFilter(iG.mul(iR), mIGR, radius);
	TheBoxFilter(iR.mul(iR), mIRR, radius);

	mIBB /= normWin;
	mIBG /= normWin;
	mIBR /= normWin;
	mIGG /= normWin;
	mIGR /= normWin;
	mIRR /= normWin;

	varIBB = mIBB - mIB.mul(mIB);
	varIBG = mIBG - mIB.mul(mIG);
	varIBR = mIBR - mIB.mul(mIR);
	varIGG = mIGG - mIG.mul(mIG);
	varIGR = mIGR - mIG.mul(mIR);
	varIRR = mIRR - mIR.mul(mIR);

	// calculate inverse
	int iy, ix;
	//invIU.create(height, width);			
	invIU.resize(height);
	cv::Matx33f epsU(
		epsl, 0.0, 0.0,
		0.0, epsl, 0.0,
		0.0, 0.0, epsl);
	for (iy=0; iy<height; ++iy)
	{
		invIU[iy].resize(width);
		for (ix=0; ix<width; ++ix)
		{
			//printf("0: %d %d\n", iy, ix);
			cv::Matx33f tmpM(
				varIBB[iy][ix], varIBG[iy][ix], varIBR[iy][ix],
				varIBG[iy][ix], varIGG[iy][ix], varIGR[iy][ix],
				varIBR[iy][ix], varIGR[iy][ix], varIRR[iy][ix]);

			// [added - 2013-10-18], try to avoid singular matrix
			// but no effect
			tmpM = tmpM+epsU;
			/*double dtrm = cv::determinant(tmpM);
			if (dtrm <= std::numeric_limits<double>::epsilon())
			{
				tmpM(0, 0) += 0.01;
				tmpM(1, 1) += 0.01;
				tmpM(2, 2) += 0.01;
			}*/

			invIU[iy][ix] = tmpM.inv();
			//invIU(iy, ix) = epsU.inv();
			//printf("%d %d %d %d\n", iy, ix, invIU.rows, invIU.cols);
			//invIU[iy][ix] = epsU.inv();
		}
	}
}