gpt4 book ai didi

c++ - 将复数的 valarray 乘以标量

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:10 25 4
gpt4 key购买 nike

valarray<double>可以乘以一个标量。但是,当我想乘以 valarray<complex<double>> 的标量时出现错误.我想知道是否有办法以漂亮的方式做到这一点。这是问题的重现:

valarray<complex<double>> v1{ { complex<double>{1,0}, complex<double>{2,0}, complex<double>{3,0} } };
valarray<complex<double>> v2 = v1 * 2.0; // error

生成 Error C2784: 'std::complex<_Other> std::operator *(const std::complex<_Other> &,const std::complex<_Other> &)': could not deduce template argument for 'const std::complex<_Other> &' from 'std::vector<std::complex<double>,std::allocator<_Ty>>' .

所以我尝试构建自己的函数,看看它是否可以完成以及以下工作:

valarray<complex<double>> VAMult(const valarray<complex<double>> &v, double scalar)
{
valarray<complex<double>> out(v.size());
for (size_t i = 0; i < v.size(); i++)
{
out[i] = v[i] * scalar;
}
return out;
}

// makes the following code work:
valarray<complex<double>> v2 = VAMult(v1, 2.0);

但是这个实现会产生非常丑陋的代码,所以我查看了 valarray.h 并找到了 * 重载定义:

operator*(const _Ty& _Left,
const valarray<_Ty>& _Right)
{ // return scalar * valarray
_VALOP(_Ty, _Right.size(), _Left * _Right[_Idx]);
}

#define _VALOP(TYPE, LENGTH, RHS) /* assign RHS(_Idx) to new valarray */ \
valarray<TYPE> _Ans(LENGTH); \
for (size_t _Idx = 0; _Idx < _Ans.size(); ++_Idx) \
_Ans[_Idx] = RHS; \
return (_Ans)

我对模板的了解非常有限,但是可以扩展这个类吗?这是我的尝试:

valarray<complex<double>> valarray<complex<double>>::operator*(const double &scalar)
{
return valarray<complex<double>>{};
}

导致 Error C2039 '*': is not a member of 'std::valarray<std::complex<double>>'

有没有办法让我的第一行代码v1 * 2.0有效还是一些密切的妥协?

最佳答案

Is there a way to make it so my first line of code v1 * 2.0 works or some close compromise?

是:相乘v1具有复标量。

编译以下代码

#include <complex>
#include <valarray>

int main()
{
std::valarray<std::complex<double>> v1{ { {1,0}, {2,0}, {3,0} } };
std::valarray<std::complex<double>> v2 = v1 * std::complex<double>{2.0};
}

问题是 valarray是一个带有 operator*() 的模板类(和类似的运算符)仅在模板类型上定义。

所以一个std::valarray<double>可以乘以 double标量,一个 std::valarray<std::complex<double>>可以乘以 std::complex<double>标量但是一个 std::valarray<std::complex<double>>不能与 double 相乘标量。

关于c++ - 将复数的 valarray 乘以标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39516513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com