Home > Enterprise >  Applying a sparsity pattern to another matrix in MATLAB
Applying a sparsity pattern to another matrix in MATLAB

Time:11-27

I'm trying to apply a sparsity pattern to another matrix. At the moment I'm just using assignment after using spalloc. MATLAB alerts that this is slow, but it doesn't give a solution to make it faster. How do I apply the sparsity pattern of A to the matrix FWtrans?

Meaning that the zero values of A have to be zero values in FWtrans. Only indices in A that have a value can have the value of FWtrans in X.

Wtrans = transpose(W);
As = sparse(A);
FWtrans = F * Wtrans;
[m,n] = size(FWtrans);
k = find(As);
X = spalloc(m,n, nnz(A));
% Optimize assignment too speed up
for i = k
    X(k) = FWtrans(k);
end

CodePudding user response:

Instead of allocating the sparse array and then copying values to it, you can use sparse to allocate the array and assign the values all at once.

Wtrans = transpose(W);
As = sparse(A);
FWtrans = F * Wtrans;
[m,n] = size(FWtrans);

% unfortunately, sparse takes only row/column coordinates...
[r,c] = find(As);
% but it's more convenient to get the values using indices
v = FWtrans(find(As));

% let sparse allocate a m*n array and
% assign the values v to the proper locations
X = sparse(r, c, v, m, n);

It might be a bit quicker to use sub2ind after find in order to find the row/column coordinates instead of calling find twice, but I have my doubts.

See also: Accessing Sparse Matrices

  • Related