2014-01-22 122 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 

但我肯定有一个更好的办法。