gpt4 book ai didi

matlab - 执行输入参数的所有可能排列(二进制样式逻辑)

转载 作者:太空宇宙 更新时间:2023-11-03 20:18:37 26 4
gpt4 key购买 nike

我正在尝试编写一些代码来为函数提供未知数量的参数。这个想法是在可能的值范围内为函数提供最小值、中间值和最大值。

例如:

  • 如果函数有3个参数
  • 参数 1 可接受范围为 0 - 10
  • 参数 2 可接受的范围是 20 - 40
  • 参数 3 可以接受的范围是 6 - 66

我的函数(para1,para2,para3)
我的函数(分钟,分钟,分钟)
我的函数(最小值、最小值、中值)
我的函数(最小值、最小值、最大值)
我的函数(最小值、中值、最小值)
我的函数(最小值、中值、中值)
我的函数(最小值、中间值、最大值)
等等……

所以使用我们上面的例子:

第一次循环我需要运行
我的函数(0, 20, 0)
下次它循环它需要运行
我的函数(0, 20, 36)
下次它循环它需要运行
我的函数(0, 20, 66)
等等……

对于所有可能的组合(在本例中为 27 种)。
但是,如果参数数量更改为接受 4,则需要能够容纳该数量,依此类推。我已经考虑过将其作为循环或递归地进行,但我认为作为循环会更容易理解,但两者都会非常有帮助。

我不想手动执行此操作,因此我们将不胜感激。

最佳答案

对于任意数量的参数(不固定为3),可以使用下面的代码。它利用 comma-separated lists ,这是处理可变数量参数的强大工具。

令 n 为参数的数量。那么组合的个数就是N = 3^n。

params = {linspace(0,10,3), linspace(20,40,3), linspace(6,66,3)};
%// cell array with arbitrary number of elements. Each cell contains a 3-vector
%// which defines min, mid, max of one parameter.

n = numel(params); %// number of parameters
N = 3^n; %// number of combinations
paramCombs = cell(1,n); %// initialization for output of ndgrid
[paramCombs{end:-1:1}] = ndgrid(params{end:-1:1}); %// generate all combinations
%// in desired order. Gives n matrices, each containing values of one parameter
paramCombs = cellfun(@(c) c(:), paramCombs, 'uni', 0); %// linearize matrices
%// into n column vectors, each with N rows.
paramCombs = [paramCombs{:}]; %// concat column vectors into N x n matrix
paramCombs = mat2cell(paramCombs,ones(N,1),ones(n,1)); %// convert to
%// N x n cell array. Each row contains a combination of parameter values
result = arrayfun(@(n) myFun(paramCombs{n,:}), 1:N, 'uni', 0); %// call myFun
%// with each combination of parameter values

result 变量是一个 1 x N 元胞数组,其中每个元胞包含使用 n 个参数的组合调用 myFun 的结果。

示例 1:myFun 的输出只是复制输入(如 @thewaywewalk's answer 中)。 params 定义如上,所以有 3 个参数:

>> result{1}
ans =
0 20 6
>> result{2}
ans =
0 20 36
>> result{3}
ans =
0 20 66
>> result{4}
ans =
0 30 6
>> result{5}
ans =
0 30 36

等等

示例 2:具有 2 个参数的情况:params = {linspace(0,2,3), linspace(0,10,3)}。同样,myFun 只是复制输入:

>> result{1}
ans =
0 0
>> result{2}
ans =
0 5
>> result{3}
ans =
0 10
>> result{4}
ans =
1 0
>> result{5}
ans =
1 5

等等

该方法可以进一步推广到每个参数的任意(并且可能不同)数量的值,只需将 N = 3^n; 行替换为

N = prod(cellfun(@numel, params)); %// number of combinations

例3:有2个参数;第一个有 3 个值,第二个有 2 个:params = {[1 2 3], [10 20]};:

>> result{1}
ans =
1 10
>> result{2}
ans =
1 20
>> result{3}
ans =
2 10
>> result{4}
ans =
2 20
>> result{5}
ans =
3 10
>> result{6}
ans =
3 20

关于matlab - 执行输入参数的所有可能排列(二进制样式逻辑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21804025/

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