2013-06-24 2 views
6

, 우리는이 같은 배열의 차원에 걸쳐 축소 할 수 있습니다 :특정 차원 집합에서 배열을 축소하는 방법은 무엇입니까? 매트랩

M  = rand(3,4,5); 
myvec = M(:);  % gives a 60-element vector 

나는 그것이 serialising 또는 병합라는 생각. 요소의 순서는 먼저 dim1, dim2, dim3이므로 [M(1,1,1); M(2,1,1); M(3,1,1); M(1,2,1); ...]이됩니다.

는하지만 내가 원하는 것은 단지 처음 두 차원에서 붕괴입니다 :

mymatrix = M(:: , :); % something that works like this? 

는 12 × 5 매트릭스를 제공 할 수 있습니다. 따라서 예를 들어, 당신은

[M(1,1,1) M(1,1,2) M(1,1,3) M(1,1,4) M(1,1,5) 
M(2,1,1) M(2,1,2) M(2,1,3) M(2,1,4) M(2,1,5) 
M(3,1,1) M(3,1,2) M(3,1,3) M(3,1,4) M(3,1,5) 
M(1,2,1) M(1,2,2) M(1,2,3) M(1,2,4) M(1,2,5) 
... 
] 

를 얻을 수 mymatrix의 첫 번째 차원은 "평평"1 원래 M의 2 차원하지만, 다른 치수를 보존되도록.

5 차원 배열의 "중간 3 차원"에 대해 실제로이를 수행해야하므로 일반 솔루션이 좋습니다! 예 : W=rand(N,N,N,N,N); mymatrix = W(:, :::, :)은 내가 의미하는 바를 알면 N x N^3 x N 행렬을 제공해야합니다.

감사

치수 길이 인수 중 하나에 대한 자리 표시로 대괄호 ( [])와

답변

5

사용 reshape : [] 계산할 reshape을 알려줍니다

sz = size(M); 
mymatrix = reshape(M, [], sz(end));  % # Collapse first two dimensions 

또는

mymatrix = reshape(M, sz(1), [], sz(end)); % # Collapse middle dimensions 

자리 표시 자 자동으로 크기. []의 발생은 하나만 사용할 수 있습니다. 다른 모든 치수 길이는 명시 적으로 지정해야합니다.

+0

감사합니다. 변형에 대해 생각해야합니다. 추신 : 나는 tmp = permute (M, [1,5,2,3,4]);,'mymatrix = tmp (:, :)'와 같이 작동하는 다른 방법을 생각했다. 그것이 항상 작동하는지 확실하지 않은가요? 물론'재구성 '은 ** 많이 선호 **합니다. –

관련 문제