我来自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开始,我还真的不知道它的功能(基本上,我只是要做矩阵乘积和求逆)。
答案 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代码。