Sparse matrix from the columns of an initial matrix

1 view (last 30 days)
Hello everyone, given a matrix A of size (m,n),
I would like to construct a matrix B of size (m,m*n) the following way :
for j = 1:n
col_start = (j-1)*m+1;
col_end = j*m;
B(:,col_start:col_end) = diag(A(:,j));
end
This version uses a for loop, is there any faster way of constructing B?
Thank you in advance.

Answers (1)

Bjorn Gustavsson
Bjorn Gustavsson on 5 Apr 2021
Something like this might work:
vals = [];
idx1 = [];
idx2 = [];
for j = 1:n
idx1 = [idx1,1:n];
col_start = (j-1)*m+1;
col_end = j*m;
idx2 = [idx2,col_start:col_end];
vals = [vals,A(:,j)'];
end
B2 = sparse(idx1,idx2,vals);
For optimal speed-improvements pre-allocate vals, idx1 and idx2 and assign those with indices instead of growing these arrays.
HTH

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!