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