2010-03-18 4 views
12

행렬을 조작 할 때 모양을 변경하는 것이 편리합니다.Mathematica에서 행렬을 재구성하는 방법

바꿀 (X는 M, N)은 M 바이 N 행렬을 반환 예를 들어, 모양 변경 함수가 존재 MATLAB 길이 NX M.의 벡터로는 N X의 M 사이즈 매트릭스 우회전 요소는 X에서 열 방향으로 취해진 다. X에 M * N 요소가 없으면 오류가 발생합니다. 매트릭스 및는 매트릭스에 대한 I 매쓰의 중첩에서의 표현을 이용한다 티카 함수 패턴 화를 사용하여 벡터 간의 변환의 경우

. 간단한 예를 들어, 내가 매트릭스 X가 있다고 가정 : 나는 벡터를 얻을 수 있습니다

4x4 matrix

펼치기 [X]와 {1,2,3, ..., 16}.

4x4 matrix

이 임의의 행렬의 생성을 허용 할만큼 :하지만 훨씬 더 유용 할 것입니다 무슨 matlab에의 모양 변경 적용에 가깝다 뭔가하는 다음과 같은 매트릭스 초래 (X는, 2,8)입니다 차원은 N * M과 같습니다. 내가 말할 수있는 한, 누군가가 자신의 Reshape 기능을 코딩하지 않았는지 궁금하게 만드는 내장 된 것은 없습니다.

답변

18
Reshape[mtx_, _, n_] := Partition[Flatten[mtx], n] 
3

나는이 오래된 스레드 알고 있지만 검색을 구글 아카이브를 위해 그리고 나는 m로 전환 할 길이 m의 * N * ... 목록을 할 수있는 일반적인 방법이있어 * N * ... 배열 :

Reshape[list_, shape__] := Module[{i = 1}, 
    NestWhile[Partition[#, shape[[i]]] &, list, ++i <= Length[shape] &] 
    ] 

예 :

In:= Reshape[Range[8], {2, 2, 2}] 

Out:= {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}} 
+0

참고 :이 솔루션은 마지막 두 차원을 이항, 그래서 잘 작동을하지 않습니다. – Guillochon

4
Reshape[list_, dimensions_] := 
First[Fold[Partition[#1, #2] &, Flatten[list], Reverse[dimensions]]] 

사용 예 :

In: Reshape[{1,2,3,4,5,6},{2,3}] 

Out: {{1,2,3},{4,5,6}} 

이것은 임의의 깊이의 배열에서 작동합니다.

10

ArrayReshape 정확히 일치합니다.

+0

이 질문은 질문을 받았을 때 사용 가능하지 않았지만 오늘은 아마도 가장 좋은 대답 일 것입니다. (버전 9의 새로운 내용) – agentp

+0

@george yes; 그것은 적응 응답을 승진시키기 위하여 위치의 정신에서이다! –

0

새로운 기능인 ArrayReshape []가 추가되었습니다.

예 :

{{1, 2, 3}, {4, 5, 6}} // MatrixForm 

ArrayReshape[{{1, 2, 3}, {4, 5, 6}}, {3, 2}] // MatrixForm 
+0

어떻게 열로 변형합니까? 즉, 요소가 세로로 아래로 이동 한 다음 다음 열로 이동합니까? –