MATLAB中如何用向量参数调用多变量函数(雅可比矩阵场景)
在MATLAB中用向量直接调用多参数函数句柄的简便方法
针对你需要用向量直接调用接受多个标量参数的函数句柄的需求,有两种简便的实现方式:
方法1:调用时直接展开向量为多参数
利用MATLAB的逗号分隔列表特性,先将向量转换为元胞数组,再展开为函数所需的多个标量参数,一行代码即可完成:
f(num2cell(v){:})
其中num2cell(v)把向量v拆分为每个元素为标量的元胞数组,{:}则将元胞数组展开为逗号分隔的标量参数,完美匹配函数句柄f的输入要求。
方法2:包装函数句柄为向量输入版本
如果需要多次调用,可以先把原函数句柄包装成接受向量输入的新句柄,后续直接用向量调用:
f_vec = @(v) f(num2cell(v){:});
之后就能直接用f_vec(x_adelantado)、f_vec(x_atrasado)的形式调用。
修改后的雅可比矩阵计算代码
将上述方法应用到你的Jacobiano函数中,优化后的代码如下:
function [J] = Jacobiano(F,x0) %#雅可比矩阵计算 % 计算函数F在x0点的雅可比矩阵(x0为ℝⁿ中的点)。 % 输入参数: F --------- 匿名函数元胞数组, % 在x0处连续可导 % x0 -------- 雅可比矩阵的计算点 h=0.01; n=length(F); m=length(x0); J = zeros(n, m); % 提前初始化矩阵,提升运行效率 for i=1:n %定位到雅可比矩阵的某一行 f=F{i}; %该行所有偏导数对应第i个函数 % 包装为接受向量输入的函数句柄 f_vec = @(v) f(num2cell(v){:}); for j=1:m x_adelantado=x0; x_adelantado(j)=x0(j)+h; x_atrasado=x0; x_atrasado(j)=x0(j)-h; J(i,j)=(1/(2*h))*(f_vec(x_adelantado)-f_vec(x_atrasado)); end end end
如果不想额外包装,也可以直接在计算时展开向量:
J(i,j)=(1/(2*h))*(f(num2cell(x_adelantado){:}) - f(num2cell(x_atrasado){:}));
补充说明
如果后续定义函数时可以自主控制,建议直接将函数定义为接受向量参数的形式(比如f = @(v) v(1)^2 + v(2)^3),从根源避免参数格式转换的问题。但如果F是已有的元胞数组无法修改,上述两种方法就是最便捷的解决方案。
内容的提问来源于stack exchange,提问作者tTomasn61
相关产品推荐
相关产品推荐

