使用数字矩阵作为源在 MATLAB 中动态创建匿名函数句柄
Creating anonymous function handle dynamically in MATLAB using numeric matrices as sources
我有点迷失在需要(动态)从巨大的矩阵和 192 个变量创建匿名函数句柄的问题中。
我将尝试为您提供一个(更简单的)示例,说明我必须做什么以及实现它的想法(但不知道如何在 MATLAB 中完成):
syms x1 x2 x3 x4 real
X = [x1 x2 x3 x4]'
F = [1 2 3 4; 1 2 3 4]
Y = [9 8]'
my_fun = (F*X + Y)' * (F*X + Y)
%solve my_fun to min for X
所以,这就是我想要的(my_fun)
。
问题是,会有 x1
到 x192
,F
就像 10000x192 和 Y
喜欢 10000x1。使用符号 tb 非常慢,因为我后来必须计算 Hessian,所以它非常慢。
我现在找到了一种数值计算 Hessian 矩阵的方法(来自 MATLAB 文件交换),但不知道如何计算 my_fun
作为(匿名)函数。我只是缺乏 MATLAB + 函数句柄的技能。我已经尝试了几件事。
所以,我想我需要知道的是如何用x(1)
到x(192)
动态创建X
,然后计算my_fun = @(x) ...
编辑:感谢您的编辑:)
我唯一能想到的解决方法是使用几个循环将匿名函数句柄创建为字符串,然后使用 str2fun
,但我觉得这不是获得什么的最简单方法我需要:)
首先:从符号工具箱中删除包含内容的前两行。你不需要这些。
您有两个选择:
使用函数文件:
这些是文件的内容 my_fun.m
:
function result = my_fun(X)
F = [1 2 3 4; 1 2 3 4];
Y = [9 8]';
result = (F*X + Y)' * (F*X + Y);
然后您可以使用 @my_fun
.
将此函数作为参数传递
使用匿名函数
您可以使用匿名函数定义函数句柄:
F = [1 2 3 4; 1 2 3 4];
Y = [9 8]';
my_fun = @(X) (F*X + Y)' * (F*X + Y);
这将捕获局部变量 F
和 Y
的当前内容。因此之后更改 F
或 Y
不会更改 my_fun
。
与上面的版本相反,您将使用 my_fun
.
传递它
我有点迷失在需要(动态)从巨大的矩阵和 192 个变量创建匿名函数句柄的问题中。
我将尝试为您提供一个(更简单的)示例,说明我必须做什么以及实现它的想法(但不知道如何在 MATLAB 中完成):
syms x1 x2 x3 x4 real
X = [x1 x2 x3 x4]'
F = [1 2 3 4; 1 2 3 4]
Y = [9 8]'
my_fun = (F*X + Y)' * (F*X + Y)
%solve my_fun to min for X
所以,这就是我想要的(my_fun)
。
问题是,会有 x1
到 x192
,F
就像 10000x192 和 Y
喜欢 10000x1。使用符号 tb 非常慢,因为我后来必须计算 Hessian,所以它非常慢。
我现在找到了一种数值计算 Hessian 矩阵的方法(来自 MATLAB 文件交换),但不知道如何计算 my_fun
作为(匿名)函数。我只是缺乏 MATLAB + 函数句柄的技能。我已经尝试了几件事。
所以,我想我需要知道的是如何用x(1)
到x(192)
动态创建X
,然后计算my_fun = @(x) ...
编辑:感谢您的编辑:)
我唯一能想到的解决方法是使用几个循环将匿名函数句柄创建为字符串,然后使用 str2fun
,但我觉得这不是获得什么的最简单方法我需要:)
首先:从符号工具箱中删除包含内容的前两行。你不需要这些。
您有两个选择:
使用函数文件:
这些是文件的内容 my_fun.m
:
function result = my_fun(X)
F = [1 2 3 4; 1 2 3 4];
Y = [9 8]';
result = (F*X + Y)' * (F*X + Y);
然后您可以使用 @my_fun
.
使用匿名函数
您可以使用匿名函数定义函数句柄:
F = [1 2 3 4; 1 2 3 4];
Y = [9 8]';
my_fun = @(X) (F*X + Y)' * (F*X + Y);
这将捕获局部变量 F
和 Y
的当前内容。因此之后更改 F
或 Y
不会更改 my_fun
。
与上面的版本相反,您将使用 my_fun
.