2015-09-30 36 views

Trả lời

5

Với permute & reshape -

reshape(permute(A,[3 2 1]),size(A,3),[]) 

mẫu chạy -

>> A 
A(:,:,1) = 
    7  1  7  5 
    3  4  8  5 
    9  4  2  6 
A(:,:,2) = 
    7  7  2  4 
    7  6  5  6 
    3  2  9  3 
A(:,:,3) = 
    7  7  5  3 
    3  9  2  8 
    5  9  2  3 
>> reshape(permute(A,[3 2 1]),size(A,3),[]) 
ans = 
    7  1  7  5  3  4  8  5  9  4  2  6 
    7  7  2  4  7  6  5  6  3  2  9  3 
    7  7  5  3  3  9  2  8  5  9  2  3 
+0

Cảm ơn sự giúp đỡ :) –

+2

Đó cũng là cách tiếp cận ưa thích của tôi! –

1

Đó có thể dễ dàng thực hiện với MATLABs ma trận unrolling cú pháp:

A=ones(N,M,O); 
B=zeros(O,N*M); 

for ii=1:size(A,3) 
    aux=A(:,:,ii);  % aux is NxM 
    B(ii,:)=aux(:);  % unroll! 
end 

(lưu ý tôi gọi O điều bạn gọi N trong hình ảnh của bạn)

+0

với điều này tôi lưu trữ các thành phần của ma trận A trong các cột của ma trận B. Dù sao cảm ơn bạn rất nhiều;) –

+2

@Traker Thay đổi điều đó! Tuy nhiên, các câu trả lời khác là tốt hơn;) –

2

Nếu bạn không nhớ một chút lập chỉ mục điên rồ ...

Bạn có thể xây dựng một linear index với appropriate shape, mà áp dụng trên mảng ban đầu sẽ cho kết quả mong muốn :

B = A(bsxfun(@plus, (1:L*M:L*M*N).', reshape(bsxfun(@plus, (0:L:L*M-1).', 0:L-1),1,[]))); 

Ví dụ:

>> A = randi(10,2,3,4)-1; %// example array; size 2x3x4 
>> A 
A(:,:,1) = 
    5  3  2 
    9  8  9 
A(:,:,2) = 
    8  7  4 
    9  8  6 
A(:,:,3) = 
    3  4  8 
    0  4  4 
A(:,:,4) = 
    2  8  8 
    4  6  7 

Kết quả:

>> B 
B = 
    5  3  2  9  8  9 
    8  7  4  9  8  6 
    3  4  8  0  4  4 
    2  8  8  4  6  7 
+0

Đó là công việc khó khăn, nhưng vui vẻ tôi đặt cược! :) – Divakar

+1

Bạn đã chọn tùy chọn ưa thích ... :-) –

+1

Cảm ơn bạn rất nhiều Luis, bằng cách bạn đã trở thành giáo viên của tôi về CMOV năm nay. Tôi rất vui khi được tham gia cùng một diễn đàn mà giáo viên của tôi: DDD –

Các vấn đề liên quan