1

在 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;

提前致谢。

4

2 回答 2

2

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

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

于 2012-10-30T07:28:40.837 回答
0

您可以定义一个以std::vector<int>参数为参数的“自由”运算符:

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但您可以将其放置在您想要的任何位置,只要它在执行操作的位置可见即可。

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

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

于 2012-10-30T07:08:32.987 回答