📄 math_10.cc
字号:
if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { output_a.makeVectorComplexDouble().assign(tmp_input.getVectorComplexDouble()); } else { output_a.makeMatrixComplexDouble().assign(tmp_input.getMatrixComplexDouble()); } } // Operation: ADD // else if (operation_d(j) == (long)ADD) { computeAddCDouble(output_a, tmp_input); } // Operation: SUBTRACT // else if (operation_d(j) == (long)SUBTRACT) { computeSubCDouble(output_a, tmp_input); } // Operation: MULTIPLY // else if (operation_d(j) == (long)MULTIPLY) { computeMultCDouble(output_a, tmp_input); } // Operation: DIVIDE // else if (operation_d(j) == (long)DIVIDE) { computeDivCDouble(output_a, tmp_input); } // invalid operation // else { return Error::handle(name(), L"computeFuncCalcEnumerateCDouble", ERR_UNKOPE, __FILE__, __LINE__); } } // add the constant term // if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { output_a.getVectorComplexDouble().add((complexdouble)const_d); } else { output_a.getMatrixComplexDouble().add((complexdouble)const_d); } // exit gracefully // return true;}// method: computeAddCDouble//// arguments:// AlgorithmData& output: (input/output) 1st operand and output// const AlgorithmData& input: (input) 2nd operand//// return: a boolean value indicating status//boolean Math::computeAddCDouble(AlgorithmData& output_a, const AlgorithmData& input_a) const { if (input_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long ilen = input_a.getVectorComplexDouble().length(); if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long olen = output_a.getVectorComplexDouble().length(); // if either input is of length 1, perform scalar addition // if (ilen == 1) { complexdouble scalar = input_a.getVectorComplexDouble()(0); return output_a.getVectorComplexDouble().add(scalar); } else if (olen == 1) { complexdouble scalar = output_a.getVectorComplexDouble()(0); return output_a.getVectorComplexDouble().add(input_a.getVectorComplexDouble(), scalar); } // if they are the same length, do vector addition // else if (ilen == olen) { return output_a.getVectorComplexDouble().add(input_a.getVectorComplexDouble()); } // else error // else { return Error::handle(name(), L"computeAddCDouble", ERR_MATCH, __FILE__, __LINE__); } } // 1 vector, 1 matrix. if the vector is of length 1, treat it as a // scalar // else if (output_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { if (ilen == 1) { complexdouble scalar = input_a.getVectorComplexDouble()(0); return output_a.getMatrixComplexDouble().add(scalar); } else { return Error::handle(name(), L"computeAddCDouble", ERR_MATCH, __FILE__, __LINE__); } } } else if (input_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { // 1 vector, 1 matrix. if the vector is of length 1, treat it as a // scalar // if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long olen = output_a.getVectorComplexDouble().length(); if (olen == 1) { complexdouble scalar = output_a.getVectorComplexDouble()(0); return output_a.makeMatrixComplexDouble().add(input_a.getMatrixComplexDouble(), scalar); } else { return Error::handle(name(), L"computeAddCDouble", ERR_MATCH, __FILE__, __LINE__); } } // if both are matrices, just add them // else if (output_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { return output_a.getMatrixComplexDouble().add(input_a.getMatrixComplexDouble()); } } // exit gracefully // return true;}// method: computeSubCDouble//// arguments:// AlgorithmData& output: (input/output) 1st operand and output// const AlgorithmData& input: (input) 2nd operand//// return: a boolean value indicating status//boolean Math::computeSubCDouble(AlgorithmData& output_a, const AlgorithmData& input_a) const { if (input_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long ilen = input_a.getVectorComplexDouble().length(); if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long olen = output_a.getVectorComplexDouble().length(); // if either input is of length 1, perform scalar subtraction // if (ilen == 1) { complexdouble scalar = input_a.getVectorComplexDouble()(0); return output_a.getVectorComplexDouble().sub(scalar); } else if (olen == 1) { // note this is different from addition since the operation is // not cummative // complexdouble scalar = output_a.getVectorComplexDouble()(0); output_a.getVectorComplexDouble().setLength(ilen); output_a.getVectorComplexDouble().assign(scalar); return output_a.getVectorComplexDouble().sub(input_a.getVectorComplexDouble()); } // if they are the same length, do vector subtraction // else if (ilen == olen) { return output_a.getVectorComplexDouble().sub(input_a.getVectorComplexDouble()); } // else error // else { return Error::handle(name(), L"computeSubCDouble", ERR_MATCH, __FILE__, __LINE__); } } // 1 vector, 1 matrix. if the vector is of length 1, treat it as a // scalar // else if (output_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { if (ilen == 1) { complexdouble scalar = input_a.getVectorComplexDouble()(0); return output_a.getMatrixComplexDouble().sub(scalar); } else { return Error::handle(name(), L"computeSubCDouble", ERR_MATCH, __FILE__, __LINE__); } } } else if (input_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { // 1 vector, 1 matrix. if the vector is of length 1, treat it as a // scalar // if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long olen = output_a.getVectorComplexDouble().length(); if (olen == 1) { // note this is different from addition since the operation is // not cummative // complexdouble scalar = output_a.getVectorComplexDouble()(0); output_a.makeMatrixComplexDouble().setDimensions(input_a.getMatrixComplexDouble()); output_a.getMatrixComplexDouble().assign(scalar); return output_a.getMatrixComplexDouble().sub(input_a.getMatrixComplexDouble()); } else { return Error::handle(name(), L"computeSubCDouble", ERR_MATCH, __FILE__, __LINE__); } } // if both are matrices, just subtract them // else if (output_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { return output_a.getMatrixComplexDouble().sub(input_a.getMatrixComplexDouble()); } } // exit gracefully // return true;}// method: computeMultCDouble//// arguments:// AlgorithmData& output: (input/output) 1st operand and output// const AlgorithmData& input: (input) 2nd operand//// return: a boolean value indicating status//boolean Math::computeMultCDouble(AlgorithmData& output_a, const AlgorithmData& input_a) const { if (input_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long ilen = input_a.getVectorComplexDouble().length(); if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long olen = output_a.getVectorComplexDouble().length(); // if either input is of length 1, perform scalar multiplication // if (ilen == 1) { complexdouble scalar = input_a.getVectorComplexDouble()(0); return output_a.getVectorComplexDouble().mult(scalar); } else if (olen == 1) { complexdouble scalar = output_a.getVectorComplexDouble()(0); return output_a.getVectorComplexDouble().mult(input_a.getVectorComplexDouble(), scalar); } // if they are the same length, do vector multiplication // else if (ilen == olen) { return output_a.getVectorComplexDouble().mult(input_a.getVectorComplexDouble()); } // else error // else { return Error::handle(name(), L"computeMultCDouble", ERR_MATCH, __FILE__, __LINE__); } } else if (output_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { // if the vector is length 1, do scalar multiplication // if (ilen == 1) { complexdouble scalar = input_a.getVectorComplexDouble()(0); return output_a.getMatrixComplexDouble().mult(scalar); } // if the vector is the correct length for multv, do it // else if (ilen == output_a.getMatrixComplexDouble().getNumColumns()) { VectorComplexDouble tmp_out; output_a.getMatrixComplexDouble().multv(tmp_out, input_a.getVectorComplexDouble()); output_a.makeVectorComplexDouble().assign(tmp_out); } // else error // else { return Error::handle(name(), L"computeMultCDouble", ERR_MATCH, __FILE__, __LINE__); } } } // input is a matrix // else if (input_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { if (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) { long olen = output_a.getVectorComplexDouble().length(); // if the vector is of length 1, do scalar multiplication // if (olen == 1) { complexdouble scalar = output_a.getVectorComplexDouble()(0); output_a.makeMatrixComplexDouble().assign(input_a.getMatrixComplexDouble()); return output_a.getMatrixComplexDouble().mult(scalar); } // if the vector is the correct length for vmult, do it // else if (olen == input_a.getMatrixComplexDouble().getNumRows()) { VectorComplexDouble tmp_out; input_a.getMatrixComplexDouble().vmult(tmp_out, output_a.getVectorComplexDouble()); output_a.getVectorComplexDouble().assign(tmp_out); } // else error // else { return Error::handle(name(), L"computeMultCDouble", ERR_MATCH, __FILE__, __LINE__); } } else if (output_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE) { return output_a.getMatrixComplexDouble().mult(input_a.getMatrixComplexDouble()); } } // exit gracefully // return true;}// method: computeDivCDouble//// arguments:// AlgorithmData& output: (input/output) 1st operand and output// const AlgorithmData& input: (input) 2nd operand//// return: a boolean value indicating status//boolean Math::computeDivCDouble(AlgorithmData& output_a, const AlgorithmData& input_a) const { // vector-matrix division is possible only if length of the // vector is 1. no other matrix division is possible // if ((input_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) && (output_a.getDataType() == AlgorithmData::MATRIX_COMPLEX_DOUBLE)) { if (input_a.getVectorComplexDouble().length() > 1) { return Error::handle(name(), L"computeDivCDouble", ERR_MATCH, __FILE__, __LINE__); } VectorComplexDouble vec(input_a.getVectorComplexDouble()); complexdouble scalar = vec(0); output_a.getMatrixComplexDouble().div(scalar); } // both inputs are vectors // else if ((input_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE) && (output_a.getDataType() == AlgorithmData::VECTOR_COMPLEX_DOUBLE)) { // if the input is of length 1, do scalar division // if (input_a.getVectorComplexDouble().length() == 1) { complexdouble scalar = input_a.getVectorComplexDouble()(0); return output_a.getVectorComplexDouble().div(scalar); } // if the lengths are equal, do element-wise division // else if (input_a.getVectorComplexDouble().length() == output_a.getVectorComplexDouble().length()) { return output_a.getVectorComplexDouble().div(input_a.getVectorComplexDouble()); } else { return Error::handle(name(), L"computeDivCDouble", ERR_MATCH, __FILE__, __LINE__); } } else { return Error::handle(name(), L"computeDivCDouble", ERR_MATCH, __FILE__, __LINE__); } // exit gracefully // return true;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -