【发布时间】:2017-01-23 02:54:57
【问题描述】:
我正在尝试使用 C++ STL 容器进行矩阵运算。 有两个大小为 Y 和 X 的向量,大小为 m,n(m>n)。我想将 X 与一个标量相乘,然后从 Y 中的给定索引中添加它。在这个过程中,我不想转换 X(不想使用 std::transform)。事实上,X 是矩阵 DPtr 中的列。下面给出了我尝试过的一个版本。
std::vector<double> D(&DPtr[index1],&DPtr[index1]+size_C);
std::transform(D.begin(), D.end(), D.begin(),std::bind2nd(std::multiplies<double>(), val1*val2));
std::transform (D.begin(), D.end(), YPtr.begin()+index2, YPtr.begin()+index2, std::plus<double>());
我正在尝试将列复制到一个临时向量并对其进行操作。
有人可以帮助我以一种更简单的方式重写代码,我不需要将列复制到另一个向量中吗?
我猜我必须使用 std::for_each 和 lamda 表达式或函数调用?但我是 C++ 新手?
只是给个引导,我想写成
std::for_each(YPtr.begin()+index2,YPtr.begin()+index2+(size_c-1),scalarAdd);
使用函数 scalarAdd 或任何可以直接访问 DPtr 的 lamda 表达式。 我也可以写
YPtr.begin()+index2+(size_c-1)
.
作为第二个参数。它有效吗? 另外想象一下,我将矩阵设为 C++ 向量,其中 DPtr 矩阵的所有列都存储在一个 C++ 向量 D 中。
【问题讨论】:
-
我知道这可以通过 C 中的单个 for 循环来完成。关键是使用 STL::containers 并隐藏抽象背后的细节。
-
如果你也关心效率,我建议你使用一个专用的线性代数库。看看 Blaze,它是目前最快的。
-
@MadhavGumma 虽然隐藏抽象背后的复杂性很好,但在这种情况下,编译器能够正确内联
scalarAdd函数非常重要,例如通过能够优化提供的 lambda 并查看所有提供的函数指针指向的函数定义。否则,性能会大幅下降。