C++ 将矩阵列乘以特征向量
我想把矩阵A的列乘以向量v,最后得到每列的和。我使用Eigen库,编码如下:C++ 将矩阵列乘以特征向量,c++,matrix,vector,eigen,C++,Matrix,Vector,Eigen,我想把矩阵A的列乘以向量v,最后得到每列的和。我使用Eigen库,编码如下: for (int j = 0 ; j< A.cols(); j++) C.col(j).noalias() = V.cwiseProduct(A.col(j)); V2 = C.colwise().sum(); 有什么想法吗?嗯。。。您要找的是一个普通的标准向量矩阵积: V2.noalias() = V.transpose() * A; .noalias()是可选的,它只在这里为您保存一个临时文件 如
for (int j = 0 ; j< A.cols(); j++)
C.col(j).noalias() = V.cwiseProduct(A.col(j));
V2 = C.colwise().sum();
有什么想法吗?嗯。。。您要找的是一个普通的标准向量矩阵积:
V2.noalias() = V.transpose() * A;
.noalias()
是可选的,它只在这里为您保存一个临时文件
如果您确实需要中间矩阵C
,那么您的两个选项应该与手工制作的for循环一样快,前提是您对它们进行更正,使它们计算出相同的内容:
C = V.asDiagonal() * A;
C = A.array().colwise() * V.array();
不要忘记启用编译器优化,例如,
-O3-march=native
什么编译器?哪些编译器标志(例如,必须打开优化)?多少时间是“慢”的,在什么硬件上?请?谢谢@AviGinsburg的回复。编译器是g++。现在时间大约是0.03秒,矩阵A的大小是(38000160)。谢谢@ggael。是的,我需要中间矩阵C
,用于代码的其余部分。有两个选项比我手工制作的for循环更快,在其他一些情况下更慢。编译器优化已启用03
,但不知道-march=native
。看来这是最快的方式!
C = V.asDiagonal() * A;
C = A.array().colwise() * V.array();