matlab - 将参数(即笛卡尔积)排列成多维数组

标签 matlab combinatorics cartesian-product

我有兴趣计算一组参数值排列的函数。我想让它保持 N 维的通用性,但让我先以 3 维的形式写出来。使用meshgrid生成排列很容易,但我不知道如何将结果数组 reshape 回多维?这是一个起点:

%These are the 3 variations of parameters, with some values.  
params1 = [100, 200, 300];%Picking these so it is easy to correlate to the function
params2 = [10, 20];
params3 = [1, 2];

%This generates parameter_values as the cartesian productpermutations.
[vec1, vec2, vec3] = meshgrid(params1, params2, params3);
parameter_values = [vec1(:) vec2(:) vec3(:)];

%Calculates functions on the set of parameters.
%Would have a fancier function, of course, this just makes it easy to see the results.
raw_vals = parameter_values(:,1) + parameter_values(:,2) + parameter_values(:,3); 

%Rearrange into a multiarray to access by parameter indices.
f_vals = reshape(raw_vals, [length(params1), length(params2), length(params3)]) %WRONG? 

%THE FOLLOWING FAIL BUT WOULD BE EXPECTED WITH THESE PARAMETERS AND THE FUNCTION.
assert(f_vals(2,1,1) == 211)
assert(f_vals(3,2,2) == 322)

最佳答案

你想要ndgrid而不是meshgrid在这种情况下。

meshgrid 的语法是 [X,Y] = meshgrid(xgv,ygv),这会导致 Y(:) 变化最快而不是 X(:)。请参阅Gridded Data Representation更多细节。换句话说,你得到了

>> [vec1, vec2, vec3] = meshgrid(params1, params2, params3)
vec1(:,:,1) =
   100   200   300
   100   200   300
vec1(:,:,2) =
   100   200   300
   100   200   300
vec2(:,:,1) =
    10    10    10
    20    20    20
vec2(:,:,2) =
    10    10    10
    20    20    20
...

但是你想要得到:

>> [vec1, vec2, vec3] = ndgrid(params1, params2, params3)
vec1(:,:,1) =
   100   100
   200   200
   300   300
vec1(:,:,2) =
   100   100
   200   200
   300   300
vec2(:,:,1) =
    10    20
    10    20
    10    20
vec2(:,:,2) =
    10    20
    10    20
    10    20
...

如果您切换到 ndgrid,那么您将得到预期的 f_vals(2,1,1) == 211

推广到 N 维可以这样完成:

    params = {[100, 200, 300],[10, 20],[1, 2]};
    vecs = cell(numel(params),1);
    [vecs{:}] = ndgrid(params{:});
    parameter_values = reshape(cat(numel(vecs)+1,vecs{:}),[],numel(vecs));
    raw_vals = sum(parameter_values,2);
    f_vals = reshape(raw_vals,cellfun(@numel,params))

关于matlab - 将参数(即笛卡尔积)排列成多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19991279/

相关文章:

python - 创建一个包含上限所有子集的列表(但其中 lst[i] ≤ 上限[i])

matlab - Octave:用于将绘图打印为 eps 的动态文件名

algorithm - 将一个集合划分为恰好 k 个 block

python - 如何在 Python 3 中将迭代过程扩展到大尺寸

algorithm - 深度优先组合算法

SQL - 不满足左连接时的交叉连接

matlab - 从一个数组中获取最大值并在另一个数组中找到它的位置

c++ - 这条 Matlab 线是什么意思?

algorithm - matlab的int8函数可以用更快的替代品代替吗