【发布时间】:2017-06-01 13:24:34
【问题描述】:
我有一个稀疏矩阵和一个向量,它们都是用犰狳构造的。现在我想将矩阵除以向量,即将矩阵的第一列除以第一个元素,依此类推。现在我可以循环执行了:
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))。还有其他更快的方法吗?
【问题讨论】:
-
我可能遗漏了一些东西,但是,您不能只计算向量的“逆”,然后将其与矩阵相乘吗?
-
你的意思是,计算
r1_matrix*(1/divider_vec)? -
@Zouch:这会将矩阵简化为我不想要的向量。
-
如果你让 divider_vec 成为对角矩阵?
-
我不确定稀疏矩阵和犰狳的具体内容,但是使用你的逆向量作为对角矩阵的对角线应该可以完成这项工作