【问题标题】:Howto use matlab like operator in C++ with stl vector如何在 C++ 中使用类似 matlab 的运算符和 stl 向量
【发布时间】:2012-10-30 07:02:45
【问题描述】:

在matlab中我们可以使用matlab操作符如下:

M=[1 2 3 4, 5 6 7 8, 9 10 11 12]
M[:,1] = M[:,2] + M[:,3]

对矩阵的所有行应用相同的操作 我想知道我们是否可以应用相同的操作将值设置为std::vector 中的一系列值,就像使用冒号(:)matlab 的运算符一样。实际上,我使用向量来存储矩阵值。

vector<int> M;

提前致谢。

【问题讨论】:

  • C++ 对此没有标准操作。您必须自己编程或使用第 3 方矩阵库
  • @JoachimPileborg 有趣的功能,我不知道,但这不是我想要的;谢谢。
  • @tuxworker:你如何想象一个没有元素循环的矩阵操作?
  • SSE SIMD 矢量化之类的东西?
  • @tuxworker,基本上你可以一次操作 4 个floats 或 2 个doubles(Matlab 也依赖于此)。虽然,因为它是非常低级的代码来处理,我建议使用 eigen(见答案)或其他库。

标签: c++ stl vector operators


【解决方案1】:

有一些 C++ 库可以像 matlab 一样处理矩阵(也允许 SIMD 向量化);例如,您可能需要考虑eigen

如果您不想依赖外部库,您可能需要考虑std::valarray,它已被明确考虑用于代数计算(使用valarrays,您可以使用std::slices 根据需要提取子矩阵)。

【讨论】:

    【解决方案2】:

    您可以定义一个以std::vector&lt;int&gt; 为参数的“免费”运算符:

    std::vector<int> operator +(const std::vector<int> &a, const std::vector<int> &b)
    {
        std::vector<int> result(a); // Copy the 'a' operand.
    
        // The usual matrix addition is defined for two matrices of the same dimensions.
        if (a.size() == b.size())
        {
            // The sum of two matrices a and a, is computed by adding corresponding elements.
            for (std::vector<int>::size_type i = 0; i < b.size(); ++b)
                // Add the values of the 'b' operand.
                result[i] += b[i];
    
            return result;
        }
    }
    
    int main(int argc, char **argv)
    {
        std::vector<int> a;
        std::vector<int> b;
    
        // The copy constructor takes care of the assignement.
        std::vector<int> c(a + b);
    
        return 0;
    }
    

    operator + 的实现非常幼稚,但只是一个想法。当心!,我在添加操作之前放置了一个 ckeck,如果检查未通过,则返回 a 操作数的副本,我认为这不是您想要的行为。

    我已将运算符放在main 的同一个文件中,但您可以将其放在任何您想要的位置,只要它在执行操作的位置可见即可。

    当然,你可以定义你想要的操作符,以链式操作实现一些更复杂的操作。

    我的数学概念已经很老了,但我希望它会有所帮助。

    【讨论】:

    • 能否详细说明如何do the stuff?这就是问题的重点。
    • 对不起,我误解了这个问题,我的数学概念很老,但我会尽力提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多