C ++ Armadillo:2D矩阵的索引数组

时间:2018-11-29 16:39:53

标签: c++ armadillo

我来自Python。我有一个用C ++处理的线性代数问题,我选择使用Armadillo这样做,因为它宣称自己像MATLAB一样,因此也像SciPy一样。

我正在寻找一种方法来填充两个矩阵,一个填充行,一个填充具有给定形状的2D矩阵的列(在Python中,将是numpy.indices)。

例如,如果我有一个4行/ 3列的矩阵形状,我想要的是建立一个行矩阵:

0 0 0
1 1 1
2 2 2
3 3 3

和列矩阵:

0 1 2
0 1 2
0 1 2
0 1 2

以便随后进行一些计算。

它类似于C++ Armadillo Generate Indices uvec of a given vec or matrix without looping it,但具有矩阵而不是一维向量。

有没有办法避免太多循环?我知道使用linspace填充矢量,但是我不希望绕过一堆矢量以将它们合并到矩阵中。我只是从Armadillo开始,我还真的不知道它的功能(基本上,我只是要做矩阵乘积和求逆)。

2 个答案:

答案 0 :(得分:1)

@茄子。 armadillo 库对于科学计算非常有用,并且易于提取。我鼓励与其文档页面armadillo documentation

结识。

关于您的特定问题,这是我提出的解决方案:

#include<iostream>
#include<armadillo>

using namespace std;
using namespace arma;

int main(int argc, char **argv)
{
    // Create two matrices A and B of shape 4x3 filled with zeros
    imat A = zeros<imat>(4, 3);
    imat B = zeros<imat>(4, 3);

    // Fill each row
    for(int i=0; i < 4; i++)
    {
        A.row(i) = i * ones<ivec>(3).t();  // 
    }

    // Fill each column
    for(int i=0; i < 3; i++)
    {
        B.col(i) = i * ones<ivec>(4);
    }
    cout << "A = \n" << A << endl;
    cout << "B = \n" << B << endl;

    return 0;
}

在我的计算机(Mac OSX和Ubuntu)上,编译过程如下:

g++ -std=c++11 -O2 `pkg-config --cflags --libs armadillo` testArmadillo.cpp -o a.out

然后,我们只需输入以下内容即可运行可执行文件:

./a.out

,输出如下:

A =
    0        0        0
    1        1        1
    2        2        2
    3        3        3

B =
    0        1        2
    0        1        2
    0        1        2
    0        1        2

有关 imat ivec 的更多信息,请参见imat和{{3} }

答案 1 :(得分:1)

虽然给出的答案确实生成了OP要求的不使用循环的解决方案的请求矩阵。这个答案使用regspace和repmat,也许在概念上更简单:

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

int main (int argc, char const* argv[])
{
    ivec a_col = regspace<ivec>(0, 3);
    imat A = repmat(a_col, 1, 3);

    irowvec b_row = regspace<irowvec>(0,2);
    imat B = repmat(b_row, 4, 1);

    cout << A << endl;
    cout << B << endl;
    return 0;
}

我不得不承认我对犰狳不陌生,所以我不保证这是快速的或遵循最佳实践,但我认为它可能最接近等效的SciPy代码。