Diagonal slices of 3D array

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 件のコメント

James Tursa
James Tursa 2020 年 9 月 25 日
Please show small complete examples showing input(s) and desired output(s).
Mark Lyubarov
Mark Lyubarov 2020 年 9 月 25 日
編集済み: Mark Lyubarov 2020 年 9 月 25 日
yes, it goes like this. For example, let C be random.
N=10;
C=rand(2*N,N,N);
D1=zeros(2*N,N);
for i=1:2*N
for j=1:N
D1(i,j)=C(i,j,j);
end
end
D1
or
D2=zeros(2*N,N)
for i=1:N
for j=1:N
D2(i,j)=C(i,i,j);
D2(i+N,j)=C(i+N,i,j);
end
end
the second is a little bit more tricky, but if I understand how to do first one, I can always split C into 2 qubic arrays and work with it.
I am new here, I don't know how to insert output, sorry. But I suppose now it is a little bit more clear.
So can I get such D1,D2 matrices without using loops?

サインインしてコメントする。

回答 (2 件)

Ameer Hamza
Ameer Hamza 2020 年 9 月 25 日
編集済み: Ameer Hamza 2020 年 9 月 25 日

1 投票

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 件のコメント

Mark Lyubarov
Mark Lyubarov 2020 年 9 月 25 日
Thank you very much, it works! And do you know if it is faster than with loops?
Ameer Hamza
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
Bruno Luong 2020 年 9 月 26 日
編集済み: Bruno Luong 2020 年 9 月 26 日

0 投票

[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));

カテゴリ

ヘルプ センター および File ExchangeSparse Matrices についてさらに検索

製品

リリース

R2019a

質問済み:

2020 年 9 月 25 日

編集済み:

2020 年 9 月 26 日

Community Treasure Hunt

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

Start Hunting!

Translated by