From 9909a54f15c8ad962669e91cb9e64548ae2ba56d Mon Sep 17 00:00:00 2001 From: kradchen Date: Wed, 7 Jun 2023 15:40:51 +0800 Subject: [PATCH] Fix scalar / matrix bug. --- src/Matrix.cpp | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Matrix.cpp b/src/Matrix.cpp index 5e9fccb..53447d8 100644 --- a/src/Matrix.cpp +++ b/src/Matrix.cpp @@ -23,6 +23,22 @@ namespace Aurora{ typedef void(*CalcFuncZ)(const MKL_INT n, const MKL_Complex16 a[], const MKL_INT inca, const MKL_Complex16 b[], const MKL_INT incb, MKL_Complex16 r[], const MKL_INT incr); + inline Matrix operatorAxM(CalcFuncD aFunc, double aScalar, const Matrix &aMatrix) { + double *output = malloc(aMatrix.getDataSize(), aMatrix.getValueType() == Complex); + //复数时,+和-需要特别操作,只影响实部 + if (aMatrix.getValueType() == Complex && (aFunc == &vdAddI || aFunc == &vdSubI)) { + aFunc(aMatrix.getDataSize(), &aScalar, 0,aMatrix.getData() , 2, output , + 2); + double zero = 0.0; + aFunc(aMatrix.getDataSize(), &zero, 0,aMatrix.getData()+1 , 2, output+1 , + 2); + } else{ + aFunc(aMatrix.getDataSize(), &aScalar, 0,aMatrix.getData(), 1, output, 1); + } + return Matrix::New(output, aMatrix.getDimSize(0), aMatrix.getDimSize(1), aMatrix.getDimSize(2), + aMatrix.getValueType()); + } + inline Matrix operatorMxA(CalcFuncD aFunc, double aScalar, const Matrix &aMatrix) { double *output = malloc(aMatrix.getDataSize(), aMatrix.getValueType() == Complex); //复数时,+和-需要特别操作,只影响实部 @@ -39,6 +55,25 @@ namespace Aurora{ aMatrix.getValueType()); } + inline Matrix &operatorAxM_RR(CalcFuncD aFunc, double aScalar, Aurora::Matrix &&aMatrix) { + if (aMatrix.getValueType() == Complex) { + //针对实部操作 + aFunc(aMatrix.getDataSize(), &aScalar, 0,aMatrix.getData(), 2, + aMatrix.getData(), + 2); + //乘法除法需特别操作,影响虚部 + if (aFunc == &vdDivI || aFunc == &vdMulI){ + aFunc(aMatrix.getDataSize(), &aScalar, 0,aMatrix.getData() + 1, 2, + aMatrix.getData() + 1, 2); + } + } else { + aFunc(aMatrix.getDataSize(), &aScalar, 0,aMatrix.getData(), 1, + aMatrix.getData(), + 1); + } + return aMatrix; + } + inline Matrix &operatorMxA_RR(CalcFuncD aFunc, double aScalar, Aurora::Matrix &&aMatrix) { if (aMatrix.getValueType() == Complex) { //针对实部操作