public double SA_CalculateErr(double[] data) { DenseMatrix mirrorMat = Utils_PCA.getMirrorTransMat(Convert.ToInt32(data[7])); Transform transform = new Transform(); transform.DoMove(data[0], data[1], data[2]); transform.DoRotateX(data[3]); transform.DoRotateY(data[4]); transform.DoRotateZ(data[5]); transform.DoScale(data[6]); DenseMatrix transformMat = transform.GetMatrix() * mirrorMat; DenseMatrix matP_init = new DenseMatrix(4, inputMat_source.ColumnCount); inputMat_source.CopyTo(matP_init); matP_init = transformMat * matP_init; DenseMatrix matP = matP_init.SubMatrix(0, 3, 0, matP_init.ColumnCount) as DenseMatrix; if (cellIndex == null) { DenseMatrix matQ_init = inputMat_target.SubMatrix(0, 3, 0, inputMat_target.ColumnCount) as DenseMatrix; cellIndex = CellIndex.GetCellIndex(matQ_init, CellsCount); } DenseMatrix matQ = cellIndex.DoPointMatch(matP); DenseMatrix matErr = matQ - matP; double Err = 0; for (int i = 0; i < matErr.ColumnCount; i++) { Err += Math.Sqrt(matErr[0, i] * matErr[0, i] + matErr[1, i] * matErr[1, i] + matErr[2, i] * matErr[2, i]); } double absScale = Math.Abs(data[6]); Err = Err / absScale; return(Err); }
private void endSA(int iloop) { double[] data = sa_Processor.currentMinData; DenseMatrix mirrorMat = Utils_PCA.getMirrorTransMat(Convert.ToInt32(data[7])); Transform transform = new Transform(); transform.DoMove(data[0], data[1], data[2]); transform.DoRotateX(data[3]); transform.DoRotateY(data[4]); transform.DoRotateZ(data[5]); transform.DoScale(data[6]); DenseMatrix transformMat = transform.GetMatrix() * mirrorMat; TWO_MESHS_sourceObj.Transform = new Transform(PCA_TransMat_target * transformMat * PCA_InvTransMat_source); DenseMatrix checkSourceMat = PCA_TransMat_target * transformMat * PCA_InvTransMat_source * TWO_MESHS_sourceObj.ToDataMat(); DenseMatrix checkSourceMat_PCA = PCA_TransMat_target * PCA_InvTransMat_source * TWO_MESHS_sourceObj.ToDataMat(); int timeDelta = EndTime - StartTime; double err_pca = Utils_CheckErr.CheckErr(checkSourceMat_PCA, TWO_MESHS_targetObj.ToDataMat()); double err = Utils_CheckErr.CheckErr(checkSourceMat, TWO_MESHS_targetObj.ToDataMat()); string str = "Time: " + timeDelta.ToString() + "\n"; str += "Err_PCA: " + err_pca.ToString() + "\n"; str += "Err: " + err.ToString() + "\n"; foreach (double rec in sa_Processor.Record) { str += rec.ToString() + "\n"; } StreamWriter writer = new StreamWriter("d:/rec_sa_" + TargetSamples.ToString() + "_" + SourceSamples.ToString() + "_" + iloop.ToString() + ".txt"); writer.Write(str); writer.Close(); }