我有一个包含w
元素的向量n
。我事先并不知道n
。
我想生成一个n
维网格g
,其值范围从grid_min
到grid_max
,并获得w
的“维度”产品}和g
。
如何为任意n
?
为简单起见,我们说grid_min = 0
和grid_max = 5
。
案例:n=1
>> w = [0.75];
>> g = 0:5
ans =
0 1 2 3 4 5
>> w * g
ans =
0 0.7500 1.5000 2.2500 3.0000 3.7500
案例:n=2
>> w = [0.1, 0.2];
>> [g1, g2] = meshgrid(0:5, 0:5)
g1 =
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
g2 =
0 0 0 0 0 0
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4
5 5 5 5 5 5
>> w(1) * g1 + w(2) * g2
ans =
0 0.1000 0.2000 0.3000 0.4000 0.5000
0.2000 0.3000 0.4000 0.5000 0.6000 0.7000
0.4000 0.5000 0.6000 0.7000 0.8000 0.9000
0.6000 0.7000 0.8000 0.9000 1.0000 1.1000
0.8000 0.9000 1.0000 1.1000 1.2000 1.3000
1.0000 1.1000 1.2000 1.3000 1.4000 1.5000
现在假设用户传入了向量w
,我们不知道它包含多少个元素(n
)。如何创建网格并获取产品?
答案 0 :(得分:6)
%// Data:
grid_min = 0;
grid_max = 5;
w = [.1 .2 .3];
%// Let's go:
n = numel(w);
gg = cell(1,n);
[gg{:}] = ndgrid(grid_min:grid_max);
gg = cat(n+1, gg{:});
result = sum(bsxfun(@times, gg, shiftdim(w(:), -n)), n+1);
如何运作:
使用ndgrid
生成网格(变量gg
),使用从单元格数组中获取的comma-separated list个n
元素作为输出。生成的n
维数组(gg{1}
,gg{2}
等)沿着n+1
- 维度(使用cat
)进行连接,转换{{1进入gg
- 维数组。向量n+1
被重新整形为w
- 维度(shiftdim
),乘以n+1
使用bsxfun
,结果沿{{{}}求和1}} - th dimension。
编辑:
根据@Divakar的深刻见解,最后一行可以替换为
gg