【问题标题】:How to assign values to variables in a handle function?如何为句柄函数中的变量赋值?
【发布时间】:2018-05-10 23:52:50
【问题描述】:

这是简化的,但以下面的 MATLAB 函数句柄为例:

F = @(x)[x(1)-x(2);x(2)-x(3)]

系统当然有很多解决方案。在替换至少一个变量后,是否有可能获得像这样的函数的解决方案?例如,将x(3)=1 替换为函数将变为:

G = @(x)[x(1)-x(2);x(2)-1]

并且可以得到其他变量的解。我使用fsolve,它适用于我拥有的方程组。当然,我需要做的事情可以使用 Symbolic Toolbox 来完成,但是在一个大的 for 循环中调用它会使我的代码使用起来太慢。

我正在尝试编写一些代码,这些代码可以在给定F 的情况下返回G 以及x 中的一组索引以替换为给定值。

【问题讨论】:

  • 很好的例子。几乎是我需要做的。不同之处在于评估 F 我使用 x,它是一个向量。这可以用向量来完成吗?考虑以下函数:function G = convert (F, x, xMatrix) 其中 xMatrix 说明要替换哪些变量。例如,如果 x=[3,2,1] 和 xMatrix=[0,0,1] 这意味着 G 将是 G = @(x)[x(1)-x(2);x(2)-1] 可以这样做吗?
  • @SardarUsama:比这更复杂,因为它是替换参数中的索引元素,而不是替换整个输入参数。

标签: matlab function variable-assignment function-handle


【解决方案1】:

您基本上要求做的是让G 调用F,并根据逻辑替换索引index 和一组替换值values 重新分配x 中的值,这是可行的,但很乱,因为anonymous functions 只能有一个可执行语句。

解决方案类似于this answer 中所做的,但我们需要使用函数形式来进行下标引用,而不是使用函数形式进行下标赋值:subsasgn。这是它的样子:

F = @(x)[x(1)-x(2); x(2)-x(3)];
values = [3 2 1];
index = logical([0 0 1]);
G = @(x) F(subsasgn(x, struct('type', '()', 'subs', {{index}}), values(index)));

这是一个测试:

>> F([3 2 3])

ans =

     1
    -1

>> F([3 2 1])  % Replace the last element by 1

ans =

     1
     1

>> G([3 2 3])  % G handles replacing the last element by 1

ans =

     1
     1

【讨论】:

  • 这工作完美。它速度很快,而且 fsolve 不能解决替换值,这正是我所需要的。可能很混乱(不容易理解),但看起来很有效。很棒的编程技巧!百万谢谢。
  • @ser:很高兴为您提供帮助!别忘了你可以mark answers as accepted
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
相关资源
最近更新 更多