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

rho*_*ron 4 matlab matrix matrix-multiplication

问题

我有一个w包含n元素的向量.我不n提前知道.

我想生成一个n三维网格g,其值范围从grid_mingrid_max,并获得了"逐个维度的"产品wg.

我怎么能这样做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
Run Code Online (Sandbox Code Playgroud)

案件: 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
Run Code Online (Sandbox Code Playgroud)

现在假设用户传入向量w,我们不知道n它包含多少个元素().如何创建网格并获取产品?

Lui*_*ndo 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);
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

使用从单元阵列获得的以逗号分隔的元素列表作为输出gg生成网格(变量).将得到的维阵列(,等等)沿着contatenated 个尺寸(使用),其转动成维阵列.该载体被整形到第尺寸(),乘以使用,并且结果沿着求和个维度.ndgridnngg{1}gg{2}n+1catggn+1wn+1shiftdimggbsxfunn+1

编辑:

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

sz_gg = size(gg);
result = zeros(sz_gg(1:end-1));
result(:) = reshape(gg,[],numel(w))*w(:);
Run Code Online (Sandbox Code Playgroud)

这导致显着的加速,因为Matlab在矩阵乘法上比在bsxfun(甚至参见此处此处)更好.