C++ 内积矩阵C+中的两行+;带本征

C++ 内积矩阵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=[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}}; // {}-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()
确实是不必要的:。