Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用矩阵数据在matlab中创建多变量函数?_Matlab_Function_Variables_Matrix - Fatal编程技术网

如何使用矩阵数据在matlab中创建多变量函数?

如何使用矩阵数据在matlab中创建多变量函数?,matlab,function,variables,matrix,Matlab,Function,Variables,Matrix,但是我想做一个程序,在这个程序中我可以生成一个多变量函数,这个函数依赖于矩阵的行数 for k = 1:sizel; f(k)=(alpha(k,1)+(beta(k,1)*p(k))+(gamma(k,1)*p(k)^2)); end cost=(sum(f)) 这是为了优化,所以我需要在最后将变量声明为p(1)、p(2)、p(3)。。。这些将是我的功能的输入 注意:我不想给变量赋值,因为这将由优化工具箱中的优化算法完成 这是完整的代码 function cost = cost(p)

但是我想做一个程序,在这个程序中我可以生成一个多变量函数,这个函数依赖于矩阵的行数

for k = 1:sizel;

f(k)=(alpha(k,1)+(beta(k,1)*p(k))+(gamma(k,1)*p(k)^2));

end

cost=(sum(f))
这是为了优化,所以我需要在最后将变量声明为
p(1)、p(2)、p(3)
。。。这些将是我的功能的输入

注意:我不想给变量赋值,因为这将由优化工具箱中的优化算法完成

这是完整的代码

function  cost = cost(p) ;
clc 
clear

costfunctionconstantsmatrix;
sizel=size(CostFormulaconstants);

alpha=CostFormulaconstants(:,1);

beta=CostFormulaconstants(:,2);

gamma=CostFormulaconstants(:,3);



for k = 1:sizel;

f(k)=(alpha(k,1)+(beta(k,1)*p(k))+(gamma(k,1)*p(k)^2));

end

cost=(sum(f))


end

我用了符号的方法,我得到了正确的成本答案,事实上,我得到了这样的东西:(53*p(1))/10+(11*p(2))/2+(29*p(3))/5+p(1)^2/250+(3*p(2)^2)/500+(9*p(3)^2)/1000+1100。但是当我试图在优化工具箱中指定要优化的函数时,它告诉我变量p是sym,不能转换为double。问题在于如何将此表达式转换为double,以便优化算法可以输入变量p(1)、p(2)和p(3)的值。

您可以将矩阵作为参数传递给函数吗

function cost = fcn(my_mat)

[m,n] = size(my_mat);
f = zeros(m,1);
for k = 1:m % for example
   f(k)=(alpha(k,1)+(beta(k,1)*p(k))+(gamma(k,1)*p(k)^2));
end
cost = sum(f);

end

我不完全清楚您的问题,但我相信您希望生成一系列函数,其中变量
alpha
beta
gamma
是常数,每个函数的值不同,向量
p
是一个参数

在你的问题中让我困惑的是,你对常量和参数都使用了索引
k
,我认为这不是你想要写的。假设我理解您的目标,解决方案可能会使用函数句柄

例如,表示法
f(k)=@(p)p(1)+p(2)
生成一个函数,将
p(1)
p(2)
相加。将
CostFormulaconstants
缩写为
cf
,下面将生成一系列函数,其中
cf
中每行一个函数

for k = 1 : size(cf, 1)
    f{k} = @(p) cf(k,1) + cf(k,2)*p(1) + cf(k,3)*p(2)^2;
end
例如,对于第三个函数,只需使用
f{3}
即可从优化工具箱向调用者提供单个函数句柄。调用
f{3}
如下所示

a = f{3}([3,4]);
如果函数确实都是多项式,
polyval
也值得一看

编辑:澄清之后,问题似乎简单了一点,不需要函数句柄。为什么不简单

function c = cost(p)
c = 0;
cf = [...]; % your coefficients here.
for k = 1 : size(cf, 1)
    c = c + cf(k,1) + cf(k,2)*p(k) + cf(k,3)*p(k)^2;
end

我不确定你到底想做什么函数的输入是矩阵和向量p?如果是这样的话,那么提交的答案就行了。你也可以检查符号变量。我使用了符号方法,得到了正确的成本答案。事实上,我得到了这样的结果:(53*p(1))/10+(11*p(2))/2+(29*p(3))/5+p(1)^2/250+(3*p(2)^2)/500+(9*p(3)^2)/1000+1100。但是当我试图在优化工具箱中指定要优化的函数时,它告诉我变量p是sym,不能转换为double。问题是如何将这个表达式转换为double,这样优化算法就可以输入变量p(1)、p(2)和p(3)的值。你检查过了吗?这会给出一个错误,因为向量p没有定义,我想他说p要传递给函数,所以可能需要编辑that@mhmsa对我假设所有必要的变量要么在函数中定义,要么作为附加参数传递,要么是全局变量。代码只是用来说明过程,而不是现成的工作。例如,我想要得到的是:f1=(0.004*(p(1)^2))+(5.3*p(1))+500 f2=(0.006*(p(2)^2))+(5.5*p(2))+400 f3=(0.009*(p(3)^2))+(5.8*p(3))+200,然后成本=f1+f2+f3在此之后,我将继续最小化成本