【问题标题】:How to do Y = aX + Y in C++如何在 C++ 中做 Y = aX + Y
【发布时间】: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 中。

Visual Representation of my question

【问题讨论】:

  • 我知道这可以通过 C 中的单个 for 循环来完成。关键是使用 STL::containers 并隐藏抽象背后的细节。
  • 如果你也关心效率,我建议你使用一个专用的线性代数库。看看 Blaze,它是目前最快的。
  • @MadhavGumma 虽然隐藏抽象背后的复杂性很好,但在这种情况下,编译器能够正确内联 scalarAdd 函数非常重要,例如通过能够优化提供的 lambda 并查看所有提供的函数指针指向的函数定义。否则,性能会大幅下降。

标签: c++ c++11


【解决方案1】:

我可以建议您使用像Eigen 这样的专用线性代数库吗?这样你就可以简单地写Y += X * a,库+编译器会为你找出最好的实现。


由于您使用的是 C++11,因此您可以将 std::transform 与 lambda 一起使用(不推荐使用 std::for_each,因为您需要转换您的 Y)。

std::transform(DPtr.begin() + index1, DPtr.begin() + index1 + size_c, // X
               YPtr.begin() + index2,                                 // Y_in
               YPtr.begin() + index2,                                 // Y_out
               [](double x, double y_in) { return a*x + y_in; });
               // y_out = a*x + y_in, for every entry.

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多