在matlab中生成具有一般维数的网格

时间:2015-01-22 11:28:28

标签: matlab matrix matrix-multiplication

问题

我有一个包含w元素的向量n。我事先并不知道n

我想生成一个n维网格g,其值范围从grid_mingrid_max,并获得w的“维度”产品}和g

如何为任意n

执行此操作

实施例

为简单起见,我们说grid_min = 0grid_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)。如何创建网格并获取产品?

1 个答案:

答案 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 listn元素作为输出。生成的n维数组(gg{1}gg{2}等)沿着n+1 - 维度(使用cat)进行连接,转换{{1进入gg - 维数组。向量n+1被重新整形为w - 维度(shiftdim),乘以n+1使用bsxfun,结果沿{{{}}求和1}} - th dimension。

编辑:

根据@Divakar的深刻见解,最后一行可以替换为

gg

导致显着的加速,因为Matlab在矩阵乘法上比在n+1时更好(参见例如herehere)。