我正在尝试为学校作业创建算法。基本上我有两个向量
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
...
答案 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
的所有值组合,使用ndgrid
和comma-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