2012-05-24 61 views
2

我有問題。 假設我有矩陣 A =選擇不帶環的滾動行

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

我需要選擇n的甲滾動的行和轉置行中的新矩陣C的元素。 我用的循環是:

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 

這是我想得做,但我可以做同樣的沒有循環的工作?

需要4分鐘計算3280x35大小的A矩陣。

+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! 

然後元素的選擇出的Ar是非常簡單的:

[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 

儘管如此,B的預分配,給你最大的改進:更多信息以http://www.mathworks.nl/help/techdoc/matlab_prog/f8-784135.html

0

我沒有Matlab的對我,但現在我認爲你可以這樣做沒有循環:

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

好的,我沒有看到n的要求... – Dan