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

Posted

技术标签:

【中文标题】C ++ Armadillo:来自二维矩阵的索引数组【英文标题】:C++ Armadillo: arrays of indices from 2D-matrix 【发布时间】:2018-11-29 16:39:52 【问题描述】:

我来自 Python。我有一个要在 C++ 中处理的线性代数问题,我选择使用 Armadillo 来解决这个问题,因为它宣称自己类似于 MATLAB,因此类似于 SciPy。

我正在寻找一种填充两个矩阵的方法,一个带有行,一个带有给定形状的二维矩阵的列(在 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 来填充向量,但我不希望循环一堆向量以将它们合并到矩阵中。我刚开始使用犰狳,我还没有真正意识到它的功能(基本上,我只是要做矩阵产品和求逆)。

【问题讨论】:

【参考方案1】:

@茄子。 犰狳 库对于科学计算非常有用且易于上手。我会鼓励通过其文档页面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

有关imativec的更多信息,请参阅imat和ivec

【讨论】:

然后循环播放!我看了看文档,但在标准 C++ 方面我也有很多东西要赶上。我使用 umat 而不是 imat 因为我只需要正整数;奇迹般有效。谢谢你:)【参考方案2】:

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

【讨论】:

auto 与犰狳对象一起使用可能会导致问题。犰狳的FAQ page 有更多详细信息。 @hbrerkere 我最近才发现这个。谢谢你的澄清,我会改变它。 =)

以上是关于C ++ Armadillo:来自二维矩阵的索引数组的主要内容,如果未能解决你的问题,请参考以下文章

Armadillo C ++中的元素方式向量或矩阵乘法

C++ Armadillo 和 OpenMp:外积求和的并行化 - 定义 Armadillo 矩阵的约简

如何通过在 Rcpp 或 Armadillo 中将矩阵乘以向量元素来复制 R 的功能?

Ubuntu21.10下安装使用Armadillo库

Ubuntu21.10下安装使用Armadillo库

C语言-对字符串二维数组各个元素进行比较-十进制数转化为其他进制数-进行规则矩阵的输出-190225