将一个函数传递给Matlab函数

3
我正在尝试构建一个matlab函数,该函数将评估作为参数发送的函数和向量。我很难想出如何发送函数以便在matlab函数中进行评估。我已经找到了如何在没有函数的情况下完成它,但是在尝试在matlab函数中评估它时有些困惑。以下是我的代码...
这就是我想做的事情...
x = [x1 x2]';
f = x(x1)^2 + 2 * (x2)^2

x = [5 10];
f = (5)^2 + 2 * (10)^2 % which I would like to return 225, not a column vector

这是我所拥有的和尝试过的...

x = [5 10]';

% without using a matlab function
% k = 1
% f = x(k)^2 + 2 * x(k + 1)^2;   % returns the correct answer of 225

f = x^2 + 2 * x^2       % complains about the scalar 2
f = x.^2 + 2 * x.^2     % returns a column vector [75; 300]
function [value] = evalFunction(f,x)
value = f(x);

我尝试过...

f = @(x) x.^2 + 2 * (x+1).^2;
value = evalFunction(@f,x)      %Error: "f" was previously used as a variable

So I tried...

f = @(x) x.^2 + 2 * (x+1).^2;
value = evalFunction(f,x)       %value = [97;342]

我是matlab的新手,希望得到一些帮助。我在stackoverflow上做了一些研究,但似乎无法使其正常工作。我知道有其他方法可以实现这个功能,但最终我会在matlab evalFunction函数中添加更多代码,因此我想用这种方式实现。谢谢!


请注意 [1 2]^2[1 2].^2 的区别。前者尝试在行向量上进行矩阵乘法,会抛出错误;而后者执行 逐元素相乘 操作,结果为 [1*1 2*2][1 4]。此外,“函数句柄”确实是您需要了解的内容。@chappj的答案包含了应该有所帮助的链接。 - Floris
我更新了问题,使其更有意义,并在结尾处没有询问正确的问题:> - user2743
2个回答

3

匿名函数函数句柄以及数组索引。将x定义为一个包含两个元素的向量,然后定义并使用您的函数:

f = @(x) x(1).^2 + 2 * x(2).^2;
value = evalFunction(f,x) % but you can just do f(x) if that is all you need

然而,如果evalFunction只是计算fx处的值,那么您根本不需要它。 只需执行f(x)即可。
或者,
f = @(x1,x2) x1.^2 + 2*x2.^2;
value = evalFunction(f,x1,x2); % here your function will call it by f(x1,x2)

抱歉,我觉得我没有表达清楚。请查看更新后的问题,再次感谢您的帮助。 - user2743
为这些有用的信息/链接点赞,以及“费力气”将问题整理成可以回答的形式... - Floris
感谢您的帮助和耐心回答我这个非常变幻莫测的问题 :> - user2743

3

您可能是从C语言背景来了解Matlab的 - 在Matlab中,x+1表示整个向量x加上1,而不是偏移1个元素。

您需要使用的函数是

f = @(x)x(1).^2 + 2 * (x(2)).^2;

或者,更像Matlab一些:
f = @(x) [1 2] * x(1:2)'.^2;

x的前两个元素逐元素平方,得到一个列向量,然后与[1 2]进行矩阵乘法运算,结果为:

1 * x(1) .^2 + 2 * x(2) .^2;

似乎这就是你所需要的。
注意:没有机会测试此内容...

1
是的,我们最终都得出了答案。问题中“我已经尝试过…”之后的所有内容都是与我的答案来回讨论的结果。这个问题相当变幻莫测。 :) - chappjc
@chappjc - 确实如此。因此我投了你的答案一票(尽管我更喜欢我的矩阵乘法方法来获得单个平方和系数的点积)。 - Floris
谢谢您的帮助,这非常有用!我已经修改了我的问题以使其更加清晰明了。您说得对,我确实是从C语言背景过来的。 - user2743

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接