在Matlab中迭代一个向量到另一个向量

时间:2014-01-22 03:36:52

标签: 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矩阵应<10×10×1025>

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
...

2 个答案:

答案 0 :(得分: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

但我相信有更好的方法。

答案 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