2014-10-12 21 views
1

我有一個矩陣,我爲其提取每列,併爲它們中的每一個做repmat函數來構建另一個矩陣。因爲我必須爲大量的向量(我的第一個矩陣的每一列)做這個,它需要很長時間(相對於我所期望的)。如果我爲整個矩陣做這件事,然後做一些事來構建它們,是否需要更少的時間?repmat,矩陣的大小或使用的數量

認爲這是一個例子:

A=[1 4 7;2 5 8;3 6 9] 

我要生產這些

A1=[1 2 3 1 2 3 1 2 3 
    1 2 3 1 2 3 1 2 3 
    1 2 3 1 2 3 1 2 3] 
A2=[4 5 6 4 5 6 4 5 6 
    4 5 6 4 5 6 4 5 6 
    4 5 6 4 5 6 4 5 6] 
A3=[7 8 9 7 8 9 7 8 9 
    7 8 9 7 8 9 7 8 9 
    7 8 9 7 8 9 7 8 9] 
+1

爲什麼不使用3D數組而不是使用三個變量混淆工作空間? – Divakar 2014-10-12 13:30:09

回答

1

作爲替代@ thewaywewalk答案,並用KRON和repmat:

clear 

A=[1 4 7;2 5 8;3 6 9]; 

B = repmat(kron(A',ones(3,1)),1,3); 


A1 = B(1:3,:) 
A2 = B(4:6,:) 
A3 = B(7:end,:) 

導致以下:

A1 = 

    1  2  3  1  2  3  1  2  3 
    1  2  3  1  2  3  1  2  3 
    1  2  3  1  2  3  1  2  3 


A2 = 

    4  5  6  4  5  6  4  5  6 
    4  5  6  4  5  6  4  5  6 
    4  5  6  4  5  6  4  5  6 


A3 = 

    7  8  9  7  8  9  7  8  9 
    7  8  9  7  8  9  7  8  9 
    7  8  9  7  8  9  7  8  9 

或者作爲@Divakar指出,這將是最好創建一個單一的3D陣列並存儲所有數據(通用解決方案):

n = 3; %// # of times you want to repeat the arrays. 

A=[1 4 7;2 5 8;3 6 9]; 

B = repmat(kron(A',ones(n,1)),1,n); 
C = zeros(n,n*size(A,2),3); 

C(:,:,1) = B(1:n,:); 
C(:,:,2) = B(n+1:2*n,:); 
C(:,:,3) = B(2*n+1:end,:); 
1

嘗試,如果這符合你的需求:

A = [1 4 7;2 5 8;3 6 9]; 
n = 3; %// size(A,1) 

cellArrayOutput = arrayfun(@(x) repmat(A(:,x).',n,n), 1:size(A,2), 'uni',0) 

,而不是不同的變量名,應有盡有存儲在單元陣列中。

如果堅持不同的名字,我會建議使用結構:

A = [1 4 7;2 5 8;3 6 9]; 
n = 3; 

structOutput = struct; 
for ii = 1:size(A,2) 
    structOutput.(['A' num2str(ii)]) = repmat(A(:,ii).', n, n); 
end 

它給你:

>> structOutput.A1 

ans = 

    1  2  3  1  2  3  1  2  3 
    1  2  3  1  2  3  1  2  3 
    1  2  3  1  2  3  1  2  3 

等。

我不希望有太多的表現加上,你應該分享你的完整代碼,以獲得進一步的幫助。

+0

很好的解決方案。如果你想直接在你的工作區中使用變量,你可以使用'assignin('base',['A'num2str(ii)],repmat(A(:,ii)。',n,n))'在循環。 – MeMyselfAndI 2014-10-12 12:41:53

+1

@JandeGier,我知道,但我不認爲它是一個很好的解決方案。 – thewaywewalk 2014-10-12 13:13:17