2014-01-22 167 views
0

我想創建一個學校作業的算法。基本上我有兩個向量在Matlab中通過另一個向量遍歷一個向量

A=[1 5](稱它們爲2米價)

B=[1 2 3 4 5 6 7 8 9 10; 1 2 3 4 5 6 7 8 9 10...] 

B是2D矩陣,並持續許多行相同的模式。我想在這個B數組中添加第三個維度,幷包含A的所有可能(價格)組合。例如

現在查看單個行並原諒我的記法,但我試圖顯示所有列,然後顯示多個維度在它後面。

B(row 1)=[1 2 3 4 5 6 7 8 9 10; 1 1 1 1 1 1 1 1 1 1] 

B(row 1)=[1 2 3 4 5 6 7 8 9 10; 1 1 1 1 1 1 1 1 1 5] 

B(row 1)=[1 2 3 4 5 6 7 8 9 10; 1 1 1 1 1 1 1 1 5 1] 

B(row 1)=[1 2 3 4 5 6 7 8 9 10; 1 1 1 1 1 1 1 1 5 5] 

這最後部分以二進制基本上計數,直到在1和5的所有組合形式存在的第三尺寸。我對如何開始這個項目感到不知所措。有任何想法嗎?

謝謝大家。

編輯:添加更多的細節。我需要路易斯所建議的,但格式略有不同。我的B矩陣看起來像這樣:

D(:,:,1)= 
0  2  3  4  5  6  7  8  9 10 
1  0  3  4  5  6  7  8  9 10 
1  2  0  4  5  6  7  8  9 10 
1  2  3  0  5  6  7  8  9 10 
1  2  3  4  0  6  7  8  9 10 
1  2  3  4  5  0  7  8  9 10 
1  2  3  4  5  6  0  8  9 10 
1  2  3  4  5  6  7  0  9 10 
1  2  3  4  5  6  7  8  0 10 
1  2  3  4  5  6  7  8  9  0 

然後我需要每個第三維圖層具有相同的重複圖案。最終,d矩陣應該是< 10x10x1025>

D(:,:,2)= 
1 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 1 
... 
D(:,:,3)= 
1 1 1 1 1 1 1 1 1 1 5 
1 1 1 1 1 1 1 1 1 1 5 
... 
D(:,:,4)= 
1 1 1 1 1 1 1 1 1 5 1 
1 1 1 1 1 1 1 1 1 5 1 
... 

回答

0

我假設B是一個向量,而不是矩陣。

該代碼生成A的所有值組合,使用ndgridcomma-separated list(從單元陣列生成)作爲輸出。然後它沿着第三維連續重複排列B

B = 1:10; %// example data. Vector of arbitrary length 
A = [1 5]; %// example data. Vector of arbitrary length 

s = numel(B); 
t = numel(A); 
C = cell(1,s); 
[C{:}] = ndgrid(A); 
C = cat(s+1, C{:}); 
C = fliplr(reshape(C, t^s, s)); 
D = cat(3, repmat(B,t^s,1), C); %// desired result 

編輯:

如果B是一個矩陣,以獲得您編輯的問題的結果,你可以按如下修改代碼:

B = [1:10; 2:11; 3:12]; %// example data. Matrix of arbitrary size 
A = [1 5]; %// example data. Vector of arbitrary length 

s = size(B,2); 
t = numel(A); 
C = cell(1,s); 
[C{:}] = ndgrid(A); 
C = cat(s+1, C{:}); 
C = fliplr(reshape(C, t^s, s)); 
C = repmat(permute(C, [3 2 1]), [size(B,1) 1 1]); 
D = cat(3, B, C); %// desired result 
+0

謝謝您的回答路易斯。你能否看到我上面的新編輯?我認爲你已經接近讓我在需要的地方。 – user3221856

+0

@ user3221856請參閱編輯答案 –

0

那麼計算1和5的一部分,你可以做這樣的事情:

A=[1 5]; 
N=2^10; 
C=ones(N,log2(N)+1); 
for i=1:N 
    d=dec2bin(i); 
    for j=1:length(d) 
     C(i,log2(N)+2-j)=A(str2double(d(j))+1); 
    end 
end 

但我肯定有一個更好的辦法。