Diagonal slices of 3D array
31 次查看(过去 30 天)
显示 更早的评论
Hello,
I have a 3D matrix C of size 2N×N×N and I need to take the diagonal slices of C and construct another 2D and 1D arrays with it. Like
D(i,j)=C(i,i,j)
D(i,j)=C(i,j,j)
D(i)=C(i,i,i)
And vice versa. If I have 1D and 2D arrays, how can I add them as diagonal slices to 3D matrix?
Is there a way to do it avoiding loops?
2 个评论
回答(2 个)
Ameer Hamza
2020-9-25
编辑:Ameer Hamza
2020-9-25
The question is not entirely clear, so the following is my guess, but such a problem can be solved using sub2ind().
C = % 2N*N*N
rows = 1:2*N;
cols = 1:N;
pages = 1:N;
idx = sub2ind(size(C), repelem(rows, 1, N), repmat(cols, 1, 2*N), repmat(pages, 1, 2*N));
D = reshape(C(idx), N, 2*N).'
2 个评论
Ameer Hamza
2020-9-26
Try using tic and toc to find the execution time in both cases. I guess the vectorized will at least be equivalent, if not faster, then the looped version.
Bruno Luong
2020-9-26
编辑:Bruno Luong
2020-9-26
[I,J] = ndgrid(1:N);
D1 = zeros(2*N,N);
D1(sub2ind(size(D1),I,J)) = C(sub2ind(size(C),I,J,J));
D2 = zeros(2*N,N);
D2(sub2ind(size(D2),I,J)) = C(sub2ind(size(C),I,I,J));
D2(sub2ind(size(D2),I+N,J)) = C(sub2ind(size(C),I+N,I,J));
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!