Sparse matrix from the columns of an initial matrix

3 views (last 30 days)
POHL Michel
POHL Michel on 5 Apr 2021
Answered: Bjorn Gustavsson on 5 Apr 2021
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));
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)'];
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.

Community Treasure Hunt

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

Start Hunting!