gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:21 25 4
gpt4 key购买 nike

问题

我有一个包含 n 元素的向量 w。我事先不知道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

大小写: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)。如何创建网格并获取产品?

最佳答案

%// 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);

这是如何运作的:

网格(变量 gg)是用 ndgrid 生成的, 使用 comma-separated list 作为输出从元胞数组中获取的 n 个元素。生成的 n 维数组(gg{1}gg{2} 等)沿着 n+1 维(使用 cat ),将 gg 转换为 n+1 维数组。向量 w 被重新整形为第 n+1 维 ( shiftdim ),使用 bsxfun 乘以 gg ,结果沿 n+1 维度求和。

编辑:

根据@Divakar 富有洞察力的评论,最后一行可以替换为

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

这会导致显着的加速,因为 Matlab 在矩阵乘法方面比 bsxfun 更好(参见示例 herehere)。

关于matlab - 在matlab中生成具有一般维数的网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28087646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com