float support for sparse matrices

This commit is contained in:
jiri committed 2026-11-05 16:37:24 +01:00
1 parent 2ed864bda4
commit c711270e25
6 files changed
+187 -33

No files matched your search

+74
View File
@@ -2691,6 +2691,18 @@ if(a.issymmetric()) result.setsymmetric();
return result;
}
template<>
const SparseMat<float> realpart<SparseMat< std::complex<float> > >(const SparseMat< std::complex<float> > &a)
{
SparseMat<float> result(a.nrows(), a.ncols());
for(SparseMat< std::complex<float> >::iterator p=a.begin(); p!=a.end(); ++p)
{
result.add(p->row,p->col,p->elem.real());
}
if(a.issymmetric()) result.setsymmetric();
return result;
}
template<>
const SparseMat<double> imagpart<SparseMat< std::complex<double> > >(const SparseMat< std::complex<double> > &a)
{
@@ -2703,6 +2715,18 @@ if(a.issymmetric()) result.setsymmetric();
return result;
}
template<>
const SparseMat<float> imagpart<SparseMat< std::complex<float> > >(const SparseMat< std::complex<float> > &a)
{
SparseMat<float> result(a.nrows(), a.ncols());
for(SparseMat< std::complex<float> >::iterator p=a.begin(); p!=a.end(); ++p)
{
result.add(p->row,p->col,p->elem.imag());
}
if(a.issymmetric()) result.setsymmetric();
return result;
}
template<>
const NRMat<double> realpart<NRMat< std::complex<double> > >(const NRMat< std::complex<double> > &a)
{
@@ -3044,6 +3068,27 @@ const SparseSMat< std::complex<double> > complexmatrix<SparseSMat<double> >(cons
return result;
}
template<>
const SparseSMat< std::complex<float> > complexmatrix<SparseSMat<float> >(const SparseSMat<float> &re, const SparseSMat<float> &im) {
if(re.nrows()!=im.nrows() || re.ncols() != im.ncols()) laerror("incompatible sizes of real and imaginary parts");
SparseSMat< std::complex<float> > result(re.nrows(),re.ncols());
std::complex<float> tmp;
SparseSMat<float>::iterator pre(re);
for(; pre.notend(); ++pre) {
tmp = pre->elem;
result.add(pre->row,pre->col,tmp,false);
}
SparseSMat<float>::iterator pim(im);
for(; pim.notend(); ++pim) {
tmp = std::complex<float>(0,1)*(pim->elem);
result.add(pim->row,pim->col,tmp,false);
}
return result;
}
template<>
const SparseSMat< std::complex<double> > realmatrix<SparseSMat<double> >(const SparseSMat<double> &re) {
SparseSMat< std::complex<double> > result(re.nrows(),re.ncols());
@@ -3058,6 +3103,20 @@ const SparseSMat< std::complex<double> > realmatrix<SparseSMat<double> >(const S
return result;
}
template<>
const SparseSMat< std::complex<float> > realmatrix<SparseSMat<float> >(const SparseSMat<float> &re) {
SparseSMat< std::complex<float> > result(re.nrows(),re.ncols());
std::complex<float> tmp;
SparseSMat<float>::iterator pre(re);
for(; pre.notend(); ++pre) {
tmp = pre->elem;
result.add(pre->row,pre->col,tmp,false);
}
return result;
}
template<>
const SparseSMat< std::complex<double> > imagmatrix<SparseSMat<double> >(const SparseSMat<double> &im) {
SparseSMat< std::complex<double> > result(im.nrows(),im.ncols());
@@ -3073,6 +3132,21 @@ const SparseSMat< std::complex<double> > imagmatrix<SparseSMat<double> >(const S
return result;
}
template<>
const SparseSMat< std::complex<float> > imagmatrix<SparseSMat<float> >(const SparseSMat<float> &im) {
SparseSMat< std::complex<float> > result(im.nrows(),im.ncols());
std::complex<float> tmp;
SparseSMat<float>::iterator pim(im);
for(; pim.notend(); ++pim) {
tmp = std::complex<float>(0,1)*(pim->elem);
result.add(pim->row,pim->col,tmp,false);
}
return result;
}