【问题标题】:Matlab anonymous function with array inputs具有数组输入的 Matlab 匿名函数
【发布时间】:2013-11-28 23:26:11
【问题描述】:

我有一个匿名函数:

a = [1, 2];
b = [1, 1; 3, 2];
c = [4, 2];
ff = @(x) (exp(a .* x) .* c) * b;

问题是,当我有一个数组时,比如 x = [1,2,3,4] ,Matlab 认为我正在使用数组并将其以指数形式相乘,而不是每个元素。 错误是

使用 .* 时出错 矩阵尺寸必须一致。

错误 @(x)(exp(a.*x).*c)*b

我只需要c1 * exp(a1 *x) * b11 + c2 * exp(a2 * x) * b21 + ... 之类的东西

如果我想评估每个 x 元素的函数,我可以使用 for 循环,它给了我想要的答案,但我认为可能有一个最简单的方法,比如我们可以简单地使用f(x) 并获得一个数组,其中每个元素在函数中求值。我尝试使用arrayfun,但我得到了同样的错误。我想跳过 for 循环,因为它们对于更大的矩阵来说很慢。

【问题讨论】:

  • 你的意思是c1 * exp(a1 *x) * b11 + c2 * exp(a2 * x) * b21 + ...
  • 是的,抱歉,我会更正我的问题
  • 您的结果应该是什么尺寸(对于给定的示例值)?
  • 对于特定的 x ,一个 1x2 数组。如果我使用 Nx1 数组,它应该给出一个 Nx2 数组,每列对应不同的x

标签: arrays matlab anonymous-function dimensions


【解决方案1】:

这个呢:

results = arrayfun(ff, x ,  'UniformOutput', false);
results{:}

【讨论】:

  • 这似乎工作得很好,谢谢。 {:} 有什么作用?由于使用第一个命令,我得到类似[1x2 double]
  • @DavidWinchester arrayfun 返回一个单元格。 results{:} 只会输出结果。
  • @DavidWinchester 是的,使用results = cell2mat(results.'); 得到一个 Nx2 矩阵
  • @DavidWinchester .' 是矩阵或数组转置。它将 1x2 向量的 1x4 数组转换为相同的 1x2 向量的 4x1 数组;然后cellmat 将其放入矩阵(4x2)形式
  • @DavidWinchester 如果没有点,它也会应用复杂的共轭。例如,如果将其应用于复数矩阵,请注意这一点。
【解决方案2】:

使用arrayfun(ff,x,'UniformOutput',false) 返回对应于您的四个输出的 4 个单元格。 我认为它应该是 c1 * exp(a1 *x) * b11 + c2 * exp(a2 * x) * b21 + ... 否则你需要在乘法之前转置你的 b 矩阵。

【讨论】:

  • 是的,之前有人指出过,我更正了我的问题。谢谢。
猜你喜欢
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
相关资源
最近更新 更多