multiplying each non zero element of a sparse matrix by a certain number

8 visualizzazioni (ultimi 30 giorni)
Hello all,
I have a sparse matrix S with few non-zero elements in its row and columns. I have a vector P with the same number of elements as the total non-zero elements of S. I would like to multiply each non-zero element of S by a value in P. For example, let
S = [0 0 1 1;0 1 1 0;1 1 0 0; 1 0 0 1]
P = [0.7421 0.3751 1.9079 1.4141 1.4411 2.0796 2.4199 1.1002]
I would like to get
W = [0 0 0.7421 0.3751;0 1.9079 1.4141 0;1.4411 2.0796 0 0; 2.4199 0 0 1.1002]
Can somebody please help me with a fast way of doing this task? Thank you.

Risposta accettata

Star Strider
Star Strider il 25 Nov 2015
This works — and NO LOOPS:
S = [0 0 1 1;0 1 1 0;1 1 0 0; 1 0 0 1] ;
P = [0.7421 0.3751 1.9079 1.4141 1.4411 2.0796 2.4199 1.1002];
Snz = find(S == 1);
Wv = S(Snz).*P';
W = zeros(1,numel(S));
W(Snz) = Wv;
W = reshape(W, size(S))'
W =
0 0 0.7421 0.3751
0 1.9079 1.4141 0
1.4411 2.0796 0 0
2.4199 0 0 1.1002

Più risposte (2)

James Tursa
James Tursa il 25 Nov 2015
Modificato: James Tursa il 25 Nov 2015
W = S;
G = logical(S);
W(G) = W(G) .* P(:);
Note: This preserves the sparse attribute of S. I.e., if S is sparse, then W will be sparse. If S is full, then W will be full.
  3 Commenti
James Tursa
James Tursa il 27 Nov 2015
Ah ... I didn't notice that you wanted the multiplication by rows, not columns. So some transposes will be required for this method. E.g.,
W = S';
G = logical(W);
W(G) = W(G) .* P(:);
W = W';

Accedi per commentare.


Stalin Samuel
Stalin Samuel il 25 Nov 2015
S = [0 0 1 1;0 1 1 0;1 1 0 0; 1 0 0 1] ;
 P =  [0.7421 0.3751 1.9079 1.4141 1.4411 2.0796 2.4199 1.1002] ;
[r c] = size(S);
W = zeros(r,c);
n = 1;
for r1 = 1:r
    for c1 = 1:c
        if S(r1,c1)~=0
            W(r1,c1) =  S(r1,c1)*P(n) ;
            n = n+1;
        end
    end
end

Categorie

Scopri di più su Sparse Matrices in Help Center e File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by