2014-04-10 1 views
2

매트릭스 재정렬 방법 :matlab에 (- 조직 재) I는 임의의 열의 행렬이

r = rand(1,300)'; 

내가 재정렬 할 그것을되도록 대신 1의 순으로 요소를 갖는, 2,3, ..., 300 요소 1,11,21,31, ..., 291,2,12,22,32, ..., 292,3,13,33, ...이 있습니다. .293, ..., 300.

즉, 1부터 시작하여 순서대로 10 번째 값을 취하고 모든 10 번째 값이 2 일 때마다 동일한 값을 입력하고 싶습니다. 이를 수행하는 한 가지 방법은 다음과 같습니다.

n = 10; 
r = [r(1:n:numel(r)); r(2:n:numel(r)); r(3:n:numel(r));...;r(10:n:numel(r))]; % Skipped 4-9 in this example 

하지만 분명히 두 번 이상 수행하는 것은 매우 번거로운 작업입니다. 더 효율적인 것이 있습니까?

루프가 쉬워야하지만 올바르게 수행하지 못하는 것 같습니다. (왜 작동하지 않을지 알 수 있지만 해결할 수는 없습니다.) (여기

내가 :)

n = 10; 
for i = 1:10 
a = [r(i:n:numel(r))]; 
end 

어떤 제안을 시도하거나 도움이 크게 감사 것입니다.

+0

문자열로 변환하고'sortrows'을 사용하는 데 도움이 : 그것은 작동하는 간단한 수정을 필요로? – Memming

답변

4

당신은 이런 식으로 작업을 수행 할 수 있습니다

r = reshape(reshape(r, 10, 30)', 300, 1) 

편집 :

@LuisMendo가 주석에 지적한 것처럼 보다 '을 사용하는 것이 더 안전합니다. 왜냐하면 행렬이 복소수이면 복소 공액을 유발할 수 있기 때문입니다. 그러면 다음과 같이하는 것이 더 안전 할 것입니다.

r = reshape(reshape(r, 10, 30).', 300, 1) 
+0

+1 직접 접근! 500 축하합니다! – Divakar

+1

'[]'-'r = reshape (reshape (r, 10, []) ', [], 1)' – Divakar

+1

+1과 함께 기본 크기 옵션을 사용할 수 있습니다. 당신은 우연히'''와 복합 결합을 도입하고있다. 대신'.''을 사용하십시오 –

1

이 시도 -

intv = 10; %%// Interval after which you intend to get the values consecutively 
out = r(reshape(reshape(1:numel(r),intv,[])',1,[])) 
1

당신은 30x10 매트릭스로를 바꿀 트랜스, 그리고 평면 지수 걸릴 수 :

A = 1:300; 
A = reshape(A,30,10); 
A = A'; 
A = A(:); 
1

게시 된 다른 솔루션 중 일부는 더 효율적이지만 생각은 좋은 것입니다.

N = numel(r); 
M = N/10; 
a=[]; 
for ii = 1:M 
     a= [a r(ii:10:N)]; 
end 

희망이