Converting a 2d array into a 3d array

조회 수: 7 (최근 30일)
Vinay Killamsetty
Vinay Killamsetty 2021년 11월 28일
답변: Turlough Hughes 2021년 11월 28일
Hi,
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?
  댓글 수: 2
Turlough Hughes
Turlough Hughes 2021년 11월 28일
Can you give an example of the code you have implemented?
Vinay Killamsetty
Vinay Killamsetty 2021년 11월 28일
편집: Vinay Killamsetty 2021년 11월 28일
size of Z_int is mxn
Z = nan(m,m,n)
for i = 1 : size( Z_int , 2)
Z( : , : , i ) = diag( (Z_int( :, i ) ) ;
end

댓글을 달려면 로그인하십시오.

답변 (2개)

Chunru
Chunru 2021년 11월 28일
"it is taking lot of time" for what size of array?
m=200; n=100;
Z_int = rand(m, n);
Z = nan(m,m,n);
tic
for i = 1 : size( Z_int , 2)
Z( : , : , i ) = diag( Z_int( :, i ) );
end
toc
Elapsed time is 0.009776 seconds.

Turlough Hughes
Turlough Hughes 2021년 11월 28일
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.

카테고리

Help CenterFile Exchange에서 Operating on Diagonal Matrices에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by