Converting a 2d array into a 3d array
13 views (last 30 days)
I am having a 2d array with size mxn
I want to convert each column into a seperate 2d diagonal matrix--- a total of 'n' diagonal matrices of size mxm
Then combining all the 2d diagonal matrices as a single 3d matrix.---size mxmxn
I tried to do this with employing a for-loop but it is taking lot of time
Can this be done without using a loop and at a faster speed?
Chunru on 28 Nov 2021
"it is taking lot of time" for what size of array?
Z_int = rand(m, n);
Z = nan(m,m,n);
for i = 1 : size( Z_int , 2)
Z( : , : , i ) = diag( Z_int( :, i ) );
Turlough Hughes on 28 Nov 2021
You could write a linear index for the diagonal elements as follows:
[m,n] = size(Z_int)
Z = zeros(m,m,n);
idx = repmat((1:m+1:m^2).',1,n) + m^2*(0:n-1);
Z(idx(:)) = Z_int(:)
This is 2-4x faster for m >= 400 on my computer (n=500), however, on the matlab servers its a slightly slower. Whether it's faster or not for you will depend on your hardware, the size of your arrays and probably the version of matlab that you're using too.