假设'a'的类型是Vector3d,我想知道1-a.array()的类型是什么。我有这个疑问,因为a.cwiseProduct(b)
有效但(1-a.array()).cwiseProduct(b)
会导致编译错误。编写(1-a.array()).cwiseProduct(b)
等代码的正确方法是什么?
int main()
{
VectorXd a(3),b(3);
a << 1,2,3;
b << 2,3,4;
// cout << (1-a.array()).cwiseProduct(b) << endl; //failed
a = 1-a.array();
cout << a.cwiseProduct(b) << endl; //works
return 0;
}
答案 0 :(得分:3)
可以在不使用self
的情况下重写表达式,方法是将.array()
替换为1的向量:
1
由于括号中包含两个向量之间的简单差异,因此操作比使用(Vector3d::Ones() - a).cwiseProduct(b)
的版本更容易识别,因此该版本可以说更清晰一些。
另一个等效变体包括使用.array()
代替.asDiagonal()
.cwiseProduct()
答案 1 :(得分:2)
(1-a.array())
仅适用于矩阵表达式,而不适用于数组(元素方式)表达式(其中“cwise”将是多余的)。简单的选择是将(1-a.array()).matrix().cwiseProduct(b)
表达式转换为矩阵表达式(1-a.array()) * b.array()
(在编译时,所以免费);或者更好的是,如果你想做元素智能的东西,只需使用所有数组对象ALTER TABLE Contact ADD FOREIGN KEY (Customer_ID) REFERENCES Customer(Customer_ID)
(再次,编译时转换是免费的)。