使用复共轭来设置/获取数组值的代理
C++: Proxy to set/get array value with a complex conjugate
我在写一个厄米矩阵的类。这是一个只有n*(n+1)/2
独立复数的复矩阵(忽略关于对角线是完全实数的细节)。
我的计划是只写上三角元素,其中行数与列数的比较满足条件,满足规则:row >= column
。然而,这需要代理之类的东西吗?我不确定如何实现这一点。问题在这里:
假设我实现了成员函数at(int row, int column)
来访问一个元素。
template<typename T>
std::complex<T>& HermitianMatrix<T>::at(long row, long column)
{
if(row >= column)
return this->_matrix[ElementIndex(row,column)];
else
return std::conj(this->_matrix[ElementIndex(column,row)]);
}
其中ElementIndex
将输入的row
和column
转换为数组中的位置std::complex<T>* _matrix = new std::complex<T>(...)
。当然,这个方法返回一个引用。你在上面看到的代码不适用于矩阵的下三角部分,因为引用在返回后就消失了。
实现这一点的正确和最有效的方法是什么,这样我就有了某种"管道",对于下三角矩阵部分,对于set和get总是通过std::conj
?
如果需要,请询问更多信息。谢谢你。
按照Franck的例子,我建议返回一个包装器类(或结构体)来包装对元素的引用,并记住一个布尔标志来记住是否需要合并数字。
类似于[注意:未测试]
template <typename T>
struct cWrapper
{
bool c;
std::complex<T> & r;
cWrapper (bool c0, std::complex<T> & r0) : c{c0}, r{r0}
{ }
operator std::complex<T>() const
{ return c ? std::conj(r) : r; }
cWrapper & operator= (const std::complex<T> & r0)
{
r = ( c ? std::conj(r0) : r0 );
return *this;
}
};
和您的函数可以变成[edit:在问题中相应的编辑后修改(else情况下的行/列反转)]
template<typename T>
cWrapper<T> HermitianMatrix<T>::at(long row, long column)
{
if(row >= column)
return cWrapper<T>(false, this->_matrix[ElementIndex(row,column)]);
else
return cWrapper<T>(true, this->_matrix[ElementIndex(column,row)]);
}
你可以实现一个属性类,并返回这个类的一个对象。
template <typename T>
struct ComplexGetter {
std::complex<T>* ref;
std::complex<T> conj;
ComplexGetter(std::complex<T>& reference) : ref(&reference) {}
ComplexGetter(const std::complex<T>& conjugate) : ref(nullptr), conj(conjugate) {}
operator std::complex<T>() const { return ref ? *ref : conj; }
operator=(const std::complex<T>& source)
{ if (ref) *ref = source;
else { ... /* do something */ }
}
};
可指定并自动转换
考虑到std::conj()不返回引用,您有两个选择:
- 在函数中不返回引用,而是返回值
- 实现你自己版本的std::conj()函数,返回一个引用
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用指针从C++中的数组中获取最大值
- 获取字符串的长度并将其分配给数组
- 数组长度,为什么从命令行获取时不能使用它?
- 如何在 nlohmann 的 json 库中获取数组长度?
- 在c++中获取两个大int,并将它们存储在数组中
- 如何在C++中获取二维数组中最少的一列数?
- 从 numpy 数组获取指针以将图像发送到C++
- 指针数组.获取指针元素的值
- 循环以使用 cstring 数组 c++ 获取用户输入
- 一种从元组/数组获取参数包的方法
- 如何使用数组获取输入,并将其存储在record.h类的主类中的变量中
- 如何使用数组获取命令行参数
- 从 JSON 数组获取天气
- 布尔数组获取意外的默认值
- 填充列表<>使用数组获取错误的数字
- 如何在C++中为矢量数据结构中的二维数组获取用户输入,而不使用行和列上的两个for循环
- 在自定义库中操作2d C++数组-获取行数
- 使用数组获取测试结果
- 数组c++获取值