//{{XLP_SRC(MyMatrixMult)
// NOTE - the FunctionWizard will add and remove mapping code here.
// DO NOT EDIT what you see in these blocks of generated code!
IMPLEMENT_XLLFN2(MyMatrixMult, "RPP", "MyMatrixMult", "X,Y",
"User Defined", "Multiply two matrices", "First matrix\000Sec"
"ond matrix\000", "\0\0", 1)
extern "C" __declspec( dllexport )
LPXLOPER MyMatrixMult(const COper* lpopX, const COper* lpopY)
{
CXlOper xloResult;
//}}XLP_SRC
BOOL bOk = TRUE;
CString strError;
// Read each matrix
xlp::matrix<double> matX;
if ( bOk && !(bOk = lpopX->ToMatrix(matX, &strError)) )
strError = "Error in X: " + strError;
xlp::matrix<double> matY;
if ( bOk && !(bOk = lpopY->ToMatrix(matY, &strError)) )
strError = "Error in Y: " + strError;
// Check their sizes
if ( bOk && !(bOk = (matX.rows() == matY.rows())
&& (matX.cols() == matY.cols())) )
strError = "Error: X and Y must be the same size";
// Dismiss input errors now
if ( !bOk )
{
xloResult = strError;
return xloResult.Ret();
}
// Calculate the result
size_t i, j;
xlp::matrix<double> matOut;
matOut.resize(matX.rows(), matX.cols());
for ( i = 0; i < matX.rows(); i++ )
for ( j = 0; j < matX.cols(); j++ )
matOut.at(i, j) = matX.at(i, j) * matY.at(i, j);
xloResult = matOut;
return xloResult.Ret();
}
COper::ToMatrix | matrix<T> | matrix<T>::resize | matrix<T>::at