我正在尝试构建一个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
所以我试过......
f = @(x) x.^2 + 2 * (x+1).^2;
value = evalFunction(f,x) %value = [97;342]
我是matlab的新手所以感谢任何帮助。我一直在做一些研究,并在stackoverflow上找到了一些东西,但似乎无法让它工作。我已经看到有其他方法可以做到这一点,但我最终会在matlab evalFunction函数中添加更多代码,所以我想这样做。谢谢!
答案 0 :(得分:3)
Anonymous functions和function handles以及数组索引。将x
作为2元素向量,定义并使用您的函数,如:
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
除了在f
评估x
之外什么都不做,那么您根本不需要它。只需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)
答案 1 :(得分:3)
你可能是从C背景来看 - 在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;
这似乎是你要求的。
警告:没有机会测试这个......