【问题标题】:Matrix multiplication of a Array Cell of function handle函数句柄的 Array Cell 的矩阵乘法
【发布时间】:2013-09-04 12:50:23
【问题描述】:

我已经建立了一个function_ handles 的单元格数组,如下所示:

B = {@(x) x(1)+x(2)^2 
     @(x) x(1)-2*x(2)}

假设A = [1 2; 3 4]。我需要执行像A*B 这样的矩阵乘法来将单元格数组作为

A*B = {@(x) x(1)+x(2)^2 + 2*(x(1)-2*x(2)) 
       @(x) 3*(x(1)+x(2)^2) + 4*(x(1)-2*(x(2))} 

我该怎么做?

【问题讨论】:

  • 你真正想要的是符号工具箱。

标签: matlab anonymous-function function-handle


【解决方案1】:

如果您可以访问 Symbolic Toolbox,则相对容易:

C=regexprep(cellfun(@func2str, B, 'uni', 0), '@\(x\)', '');
F=arrayfun(@(d) ['@(x) ', char(d)], sym(A)*sym(C), 'uni', 0);

返回

>> F
F = 
    '@(x) 3*x(1) - 4*x(2) + x(2)^2'
    '@(x) 7*x(1) - 8*x(2) + 3*x(2)^2'

请注意,符号操作实际上简化了结果。

【讨论】:

  • Mohsen 这是一个非常聪明的把戏。再次感谢您的回复。
【解决方案2】:

别无他法:

  1. 编写自己的class,支持function_handlesdoubles 的乘法和/或加法
  2. 将所有内容转换为字符串、操作字符串并转换回函数句柄(参见 Mohsen 提出的精彩版本)
  3. 实际上不要创建 A*B,而只是评估它(只计算A*cellfun(@(f)f(y),B) 一些y
  4. 手动复制粘贴表达式
  5. ...其他东西无疑是丑陋的。

出于好奇,您能否解释一下您“需要”此操作的原因?

【讨论】:

  • 你知道我要求解一个非线性方程组 AB(X) = X。X={x1,x2,...,xn} 是 n-dim 和 B( X) 是相同的暗淡向量,在其每一行中都包含一个关于 {x1,x2,...,xn} 的非线性方程,A 是一个 nxn 常数矩阵。关键是 B(X) 的每一行都是通过 FOR 循环中的程序形成的。我想用 fsolve 来求解方程组。
  • @user2745742:这并不能真正证明这种技术的合理性。您基本上是在求解非线性方程的线性组合。有更好的方法来做到这一点(现在必须运行,抱歉)
  • 我在下面实现了您的解决方案 5) :)
猜你喜欢
  • 2021-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
相关资源
最近更新 更多