[英]Divide Matrix by vector in armadillo
我有一个稀疏矩阵和一个向量,都是用犰狳构造的。 现在,我想将矩阵除以矢量,即矩阵的第一列除以第一个元素,依此类推。 现在,我可以循环执行此操作:
int r_num = 5000;
arma::colvec r_vec = arma::linspace(0, 1, r_num);
double dh = abs(r_vec(1)-r_vec(0));
arma::sp_cx_mat r1_matrix = arma::sp_cx_mat(r_num, r_num);
r1_matrix.diag(0).fill(0);
r1_matrix.diag(1).fill(8);
r1_matrix.diag(-1).fill(-8);
r1_matrix.diag(2).fill(-1);
r1_matrix.diag(-2).fill(1);
arma::cx_colvec divider_vec = r_vec*std::complex<double>{1.0, 0.0};
divider_vec(0) = 1;
for (size_t i = 0; i < r_num; i++)
{
if (i % 100 == 0)
std::cout << i << " of " << r_num << '\n';
r1_matrix.col(i) = r1_matrix.col(i) / divider_vec(i);
}
但这非常慢(尤其是在之后我将增加r_num
之后)。 使用通常的方法时
r1_matrix = r1_matrix/divider_vec;
我收到尺寸不匹配的错误((5000x5000)和(5000x1))。 还有另一种更快的方法吗?
除了可能由于矩阵稀疏或犰狳(我一点都不知道)而导致的细节外,我想解决问题的最佳方法是计算向量的逆,将其存储为对角矩阵的对角矩阵的大小),然后将您的矩阵乘以该计算所得的值。
使用Eigen的一些示例:
#include <Eigen/Core>
#include <iostream>
using namespace Eigen;
int main()
{
Matrix<float, 3, 3> r1_matrix;
r1_matrix <<
2, 3, 5,
4, 6, 10,
6, 9, 15;
Matrix<float, 3, 1> divider_vec;
divider_vec << 2, 3, 5;
divider_vec = divider_vec.cwiseInverse();
Matrix<float, 3, 3> divider_mat = divider_vec.asDiagonal();
r1_matrix = r1_matrix * divider_mat;
std::cout << std::endl << r1_matrix << std::endl;
Matrix<float, 5, 3> r2_matrix;
r2_matrix <<
2, 3, 5,
4, 6, 10,
6, 9, 15,
8, 12, 20,
10, 15, 25;
Matrix<float, 3, 5> divider_mat2 = Matrix<float, 3, 5>::Zero();
divider_mat2.block<3, 3>(0, 0) = divider_mat;
r2_matrix = (r2_matrix * divider_mat2).block<5, 3>(0, 0);
std::cout << std::endl << r2_matrix << std::endl;
SparseMatrix<float> sp_matrix(5, 5);
std::vector<Triplet<float>> data =
{
{ 0, 0, 2.f }, { 2, 1, 6.f }, { 1, 2, 10.f }, { 3, 3, 14.f }, { 4, 3, 21.f }, { 1, 4, 11.f }
};
sp_matrix.setFromTriplets(data.begin(), data.end());
Matrix<float, 5, 1> divider_vec2;
divider_vec2 << 2, 3, 5, 7, 11;
divider_vec2 = divider_vec2.cwiseInverse();
SparseMatrix<float> divider_sp_mat(5, 5);
data.clear();
for (int i = 0; i < 5; ++i)
{
data.push_back(Triplet<float>{ i, i, divider_vec2[i]});
}
divider_sp_mat.setFromTriplets(data.begin(), data.end());
sp_matrix = sp_matrix * divider_sp_mat;
std::cout << std::endl << sp_matrix << std::endl;
return 0;
}
我不知道当矩阵的行数多于列数时,是否有其他方法可以制作正方形矩阵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.