2012-05-24 6 views
2

질문이 있습니다. I가 있다고 가정 행렬 A =루프없이 회전하는 행을 선택하십시오.

I는 n은 압연에서 행을 선택하고 새로운 행 행렬 C의 요소 트랜스해야
1  2  3 
4  5  6 
7  8  9 
10 11 12 

.

n = 3;  %for instance every 3 rows of A 

B = []; 

for i = 1:n 

    Btemp = transpose(A(i:i+size(A,1)-n,:)); 

    B = [B;Btemp]; 

end 

C=B'; 

하고는 행렬 C 생산 : 내가 사용 루프는이 내가 너무 싶어 할 것입니다

C =

1  2  3  4  5  6  7  8  9 
4  5  6  7  8  9 10 11 12 

을,하지만 난 같은 작업을 수행 할 수 있습니다 루프가없는 직업?

3280x35 크기의 A 행렬을 계산하는 데 4 분이 걸립니다.

+0

방법 것입니다 내 경우에는 모양 변경 기능을 사용할 수 있습니까? 나는 MATLAB을 처음 사용합니다. – mario

답변

1

초기화를하면 매우 빠르게 작동한다고 생각합니다. 그리고 다른 트릭은 MATLAB이 행 대신 첫 번째 인덱스로 열을 사용하기 때문에 먼저 조인을 가져 오는 것입니다.

tic 
A = reshape(1:3280*35,[3280 35])'; %# Generate an example A 
[nRows, nCols] = size(A); 

n = 3; %for instance every 3 rows of A 
B = zeros(nRows-n+1,nCols*n); 
At = A'; 
for i = 1:size(B,1) 
    B(i,:) = reshape(At(:,i:i+n-1), [1 nCols*n]); 
end 
toc 

경과 시간이 나는 루프에서 고쳐 사용하지만, 첫 번째로 하나 개의 행을 변환하지 않을

Elapsed time is 0.004059 seconds. 
+0

정말 고마워요 !! – mario

+1

+1 : @petrichor 좋은 친구. 나는 비슷한 대답을하려고하고 있었지만, 나보다 앞섰다. –

+0

오케이, 아직 사이트 규칙에 익숙하지 않습니다. 어떻게해야합니까? 클릭 "이 게시물은 당신에게 유용 했습니까?" – mario

0

이다 (실제로도 작동하는 열은 중요하지 않습니다)

Ar = reshape(A',1,[]); % the ' is important here! 

후 아르곤 중에서 요소의 선택은 실제로 간단

[nrows, ncols] = size(A); 
new_ncols = ncols*n; 
B = zeros(nrows-(n-1),new_ncols); 

for ii = 1:nrows-(n-1) 
    B(ii,:) = Ar(n*(ii-1)+(1:new_ncols)); 
end 
0

그러나 B의 사전 할당은, 당신에게 가장 큰 개선을 제공합니다 : 나는 지금 나에게 matlab에없는 http://www.mathworks.nl/help/techdoc/matlab_prog/f8-784135.html

0

에서 더 많은 정보를하지만 난 당신이 이런 식으로 루프없이이 작업을 수행 할 수 있다고 생각 :

reshape(permute(cat(A(1:end-1,:),A(2:end,:),3),[3,2,1]), [2, size(A,2)*(size(A,1) - 1)]); 

사실이 당신이? 원하는 것을하지 않을 것이다

A1 = A(1:end-1,:); 
A2 = A(2:end,:); 
answer = [A1(:) ; A2(:)] 
+0

이제'3280x35 '크기와'n = 3' 크기의 A에 대해 수행합니다. 그건 좋은 시간 동안 당신에게 바쁜 타이핑을 계속할 것입니다 :) –

+0

OK n 요구 사항을 보지 못했습니다 ... – Dan

관련 문제