2017-06-01 108 views
0

我有一個稀疏矩陣和一個矢量,都是用犰狳構建的。現在我想用矢量來劃分矩陣,即用矩陣的第一個元素除第一列,依此類推。現在,我可以做,在一個循環:在犰狳中用矢量除矩陣

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))的錯誤。還有另一種更快的方法嗎?

+0

我可能會錯過一些東西,但是,難道你不能只計算矢量的「逆」,然後乘以矩陣? – Zouch

+0

你的意思是,計算'r1_matrix *(1/divider_vec)'? –

+0

@Zouch:將矩陣減少爲一個我不想要的向量。 –

回答

1

除了由於稀疏矩陣或犰狳(我根本不知道)的具體情況,我認爲解決您的問題的最佳方式是計算您的向量的逆,將其存儲爲對角線對角線矩陣(矩陣的大小),然後將矩陣乘以這個計算的矩陣。

使用本徵的一些例子:

#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; 
} 

我不知道是否有另一種方式不是讓一個方陣,當基質比列更多的行雖然。