C++ Armadillo:二维矩阵的索引数组

C++ Armadillo: arrays of indices from 2D-matrix

我来自Python。我有一个用 C++ 处理的线性代数问题,我选择使用 Armadillo 来解决,因为它宣称自己是 MATLAB 类的,因此 SciPy-like.

我正在寻找一种方法来填充两个矩阵,一个包含行,一个包含给定形状的二维矩阵的列(在 Python 中,即 numpy.indices ).

例如,如果我有一个 4 rows/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

为了之后做一些计算。

它类似于 但使用矩阵而不是一维向量。

有没有没有太多循环的方法?我知道 linspace 可以填充一个向量,但我不想循环遍历一堆向量以将它们合并到一个矩阵中。我刚开始使用犰狳,我还没有真正了解它的功能(基本上,我只有矩阵乘积和求逆要做)。

@茄子。 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 and ivec

虽然给出的答案确实生成了请求的矩阵,但 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 代码。