1

我有一个这样的数字向量:

myVec= [ 1 2 3 4 5 6 7 8 ...]

我有一个自定义函数,它接受一个数字的输入,执行一个算法并返回另一个数字。

cust(1)= 55, cust(2)= 497, cust(3)= 14, etc. 

我希望能够返回产生最高结果的第一个向量中的数字。

我目前的想法是生成第二个向量 ,outcomeVec其中包含自定义函数的输出,然后找到具有 的向量的索引max(outcomeVec),然后将该索引匹配到myVec。我想知道,有没有更有效的方法来做到这一点?

4

2 回答 2

0

你描述的是一个很好的方法。

outcomeVec = myfunc(myVec);
[~,ndx] = max(outcomeVec);
myVec(ndx) % input that produces max output

另一种选择是使用循环来完成。这节省了一点内存,但可能会更慢。

maxOutputValue = -Inf;
maxOutputNdx = NaN;
for ndx = 1:length(myVec)
    output = myfunc(myVec(ndx));
    if output > maxOutputValue
        maxOutputValue = output;
        maxOutputNdx = ndx;
    end
end
myVec(maxOutputNdx) % input that produces max output

这些几乎是您唯一的选择。

您可以通过编写一个接受函数句柄和输入数组的通用函数来使其变得花哨。该方法将实现上述技术之一并返回产生最大输出的输入值。

于 2013-09-04T13:28:09.200 回答
0

根据您搜索的离散数字范围的大小,您可能会发现使用黄金分割算法的解决方案更有效。例如,我尝试最小化以下内容:

bf = -21;
f =@(x) round(x-bf).^2;

在 [-100 100] 范围内,使用基于来自 Mathworks 文件交换的脚本的例程。这个特定的文件交换脚本似乎没有正确实现黄金分割,因为它每次迭代都会调用两个函数。修复此问题后,所需的调用次数减少到 12 次,这肯定优于在“愚蠢”调用min. 收益很快就会变得巨大。例如,如果搜索区域是 [-100000 100000],golden 会在 25 个函数调用中找到最小值,而不是 200000 - 黄金分割中的调用次数对范围的依赖性是对数的,而不是线性的。

因此,如果范围足够大,其他方法肯定可以min通过需要更少的函数调用来击败。最小化搜索例程有时会在早期步骤中包含这样的搜索。但是,您将遇到收敛(终止)标准的问题,您必须对其进行修改,以便例程知道何时停止。min最好的选择可能是通过从黄金分割的几次迭代开始来缩小应用的搜索区域。

一个重要的警告是,保证黄金分割只适用于单峰区域,即显示单个最小值。在包含多个最小值的区域中,它可能会卡在一个最小值中并可能错过全局最小值。从这个意义上说,这min是一个肯定的赌注。

另请注意,此处示例中的函数对 input 进行四舍五入x,而您的函数采用整数输入。这意味着您必须在函数周围放置一个包装器,该包装器会舍入调用黄金例程传递的输入。

其他人似乎使用遗传算法来执行这样的搜索,尽管我没有对此进行研究。

于 2013-09-04T18:00:48.807 回答