0

我有点迷失在一个问题中,我需要(动态地)从巨大的矩阵和 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有10000x192 和10000x1。使用符号 tb 非常慢,因为我后来必须计算 Hessian,所以它超级慢。x192FY

我现在找到了一种数值计算 Hessian 的方法(来自 MATLAB 文件交换),但不知道如何计算my_fun为(匿名)函数。我只是缺乏 MATLAB + 函数句柄的技能。我已经尝试了几件事。

所以,我想我需要知道的是如何用 to动态X创建然后计算x(1)x(192)my_fun = @(x) ...

编辑:感谢您的编辑:) 我能想到的唯一解决此问题的方法是使用几个循环将匿名函数句柄创建为字符串,然后使用str2fun,但我觉得这不是最简单的方法得到我需要的东西:)

4

1 回答 1

1

首先:从符号工具箱中删除包含内容的前两行。你不需要这些。

你有两个选择:

使用函数文件:

这些将是文件的内容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);

这将捕获本地变量的当前内容FY. 所以改变FY之后不会改变my_fun。与上述版本相比,您将使用my_fun.

于 2015-01-03T21:03:56.973 回答