Fix scalar / matrix bug.

This commit is contained in:
kradchen
2023-06-07 15:40:51 +08:00
parent f5ac96d9ba
commit 9909a54f15

View File

@@ -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) {
//针对实部操作