2016-10-28 4 views
1

Je l'instruction suivante dans MatlabaccumArray de Matlab utilisant la multiplication de matrice creuse

out = accumarray (A,B,sz); 

où B et A est de taille 1x957600 et 957600x1, respectivement, et est sz [1445 1]. Le résultat est de taille 1445x1.

Ma question est comment pouvons-nous mettre en œuvre cette instruction sans utiliser accumarray et en utilisant une multiplication de matrice clairsemée.

Je trouve cette solution suivante, mais je ne sais pas comment mettre en œuvre selon les données que j'ai

Matlab code

%fake data setup 
    M=1e5; 
    A=kron(speye(M),ones(1,16)); 
    N=size(A,2); 
    [I,J]=find(A); 
    x=rand(N,1); 
    %pretend we build A from scratch 
    tic; 
    A=sparse(I,J,1); 
    toc %Elapsed time is 0.062737 seconds. 
    %Apply A 
    tic 
     y1=A*x; 
    toc %Elapsed time is 0.006868 seconds. 
    %Using accumarray 
    b=x(J); 
    tic 
    y2=accumarray(I,b,[M,1]); 
    toc %Elapsed time is 0.012236 seconds. 

Je pose cette question parce que je veux utiliser accumArray dans C++. J'ai une solution pour ça mais ça prend beaucoup de temps pour faire le calcul. Here est ma question d'il y a deux jours qui a l'implémentation C++ pour accumarray.

Répondre

1

Utilisez

sparse(A, 1, B, sz(1), sz(2)) 

Exemple:

A = [5;4;6;5;2;5;2;5;5;2]; 
B = [6 3 1 4 9 8 1 5 8 9]; 
sz = [10 1]; 
out = accumarray (A,B,sz); 
out2 = sparse(A, 1, B, sz(1), sz(2)); 

Cela donne

>> out 
out = 
    0 
    19 
    0 
    3 
    31 
    1 
    0 
    0 
    0 
    0 
>> full(out2) 
ans = 
    0 
    19 
    0 
    3 
    31 
    1 
    0 
    0 
    0 
    0 
+0

Merci! Fonctionne parfaitement bien. Maintenant, je viens de trouver un moyen de le faire en C++. Armadillo ne supporte pas l'initialisation clairsemée en utilisant des indices identiques. Alors peut-être que je vais devoir chercher une autre bibliothèque. –

+0

J'avais tort. Armadillo prend en charge l'initialisation de la matrice clairsemée en utilisant des emplacements identiques 'sp_mat (add_values, locations, valeurs, n_rows, n_cols, sort_locations = true, check_for_zeros = true)'. Merci pour votre réponse. –