C++ 内积矩阵C+中的两行+;带本征
我想做一个内积如下。 矩阵a=[1,2,3,4] 矩阵b=[1,2,3,4] a*b=[1,4,9,16]c[i]=a[i]*b[i] 如何使用本征矩阵xSDC++ 内积矩阵C+中的两行+;带本征,c++,arrays,matrix,eigen,C++,Arrays,Matrix,Eigen,我想做一个内积如下。 矩阵a=[1,2,3,4] 矩阵b=[1,2,3,4] a*b=[1,4,9,16]c[i]=a[i]*b[i] 如何使用本征矩阵xSD 谢谢。您所描述的是一种元素型产品(“内部产品”通常指的是产品)。您可以编写以下内容之一: a.cwiseProduct(b); // or a.array() * b.array(); 但是,如果您主要使用元素操作,则应该将a和b声明为Array: Eigen::ArrayXd a{{1,2,3,4}}, b{{1,2,3,4}}; /
谢谢。您所描述的是一种元素型产品(“内部产品”通常指的是产品)。您可以编写以下内容之一:
a.cwiseProduct(b);
// or
a.array() * b.array();
但是,如果您主要使用元素操作,则应该将a
和b
声明为Array
:
Eigen::ArrayXd a{{1,2,3,4}}, b{{1,2,3,4}}; // {}-initialization requires C++11, and the development branch of Eigen
Eigen::ArrayXd c = a*b;
Godbolt演示:可以使用成员函数来实现以下功能:
c = a.asDiagonal() * b;
在这种情况下,c
是由包含向量a
元素的对角矩阵与向量b
的矩阵向量积得到的向量。术语“向量”可互换地用于描述一维矩阵
这里假定b
是列向量MatrixXd b(4,1)
。如果它是一个行向量矩阵b(1,4)
可以使用a.asDiagonal()*b.transpose()
我不希望此选项与@chtz建议的解决方案在性能方面有任何显著差异。请阅读,尤其是和。还有。最后,不要忘了如何创建一个。这个问题是非常合理的,问题已经清楚地陈述了,期望的输出已经描述了。唯一的错误是错误的术语“内部产品”。已经发布了几个有效的答案,这对未来的读者可能很有用。投票重新开放。嗨。我使用了本征值并测试了时间。它比我使用(…)c[I]=a[I]*b[I];你能提出改进的方法吗?谢谢。你试过用优化编译吗?(
-O2
或带有gcc/clang的-O3
)非常感谢!如果您编写c.noalias()
而不是c
并启用优化,这将生成与数组变体相同的代码:@chtz这非常有趣。谢谢你的评论。如果我理解正确,.noalias()
更快,因为它可以防止在将值分配给c
之前对临时值进行求值,而这不是默认值的原因是类似于a=a.asDiagonal()*b
的情况。但我假设,如果变量声明为VectorXd c=a.asDiagonal()*b代码>,对吗?我的错。对于a.asDiagonal()*b
来说,.noalias()
确实是不必要的:。