【问题标题】:Matlab: implementing sum of exponentials using function handlesMatlab:使用函数句柄实现指数总和
【发布时间】:2018-12-09 17:48:08
【问题描述】:

我需要在 Matlab 中使用函数句柄来实现以下公式

其中 t 是时间向量,n 很大。此外,对于每个 k,Sk 和 fk 都是常数。任何有效的实现方式都值得赞赏。

编辑:

对于一次谐波,我可以写

y=@(t) s(1)*exp(i*2*pi*f(1)*t);

但是,我不能在 for 循环中使用它来生成 f(t)。有没有矢量方法可以做到这一点?

【问题讨论】:

  • 是的,我知道这一点!这不是硬件!
  • 我编辑了我的帖子以更具体。
  • “我不能在 for 循环中使用它来生成 f(t)”——为什么不呢?是硬编码的s(1)吗?为什么不干脆做y=@(t,k) ...
  • 添加它们(函数句柄)会导致错误,指出它不可行。添加它们的正确方法是 y3=@(x)(y1(x) + y2(x))。但是,随着术语数量的增加,这变得不切实际。
  • 我以为你想做一个循环r=0; for k=1:N, r=r+f(t,k); end。如果不是,那么首先使用函数句柄有什么意义?您是否正在寻找一个返回 k 之和的函数句柄?

标签: matlab


【解决方案1】:

假设您有一个长度相同的数据向量s、一个频率向量f,以及一个(可能)不同长度的时间向量t,您可以使用

计算给定的方程
result = sum( s(:) .* exp( i*2*pi * f(:) .* t(:).' ), 1 );

这里发生的是s(:) 强制s 成为列向量。我们以相同的方式将f 制作成列向量。 t(:).' 是一个行向量。 MATLAB 执行隐式单例扩展,因此 f(:) .* t(:).' 返回一个二维矩阵。另一个.* 也对s 进行单例扩展。最后sum(.,1) 对第一个维度求和,该维度是f 的所有值。结果是一个与t长度相同的行向量。

如果您需要一个计算这个的函数句柄,只需将单行代码转换为匿名函数:

y = @(t) sum( s(:) .* exp( i*2*pi * f(:) .* t(:).' ), 1 );

此匿名函数将在定义时捕获sft 可以稍后提供:

result = y(t);

但请注意,ifft 执行相同的计算但效率更高。

【讨论】:

  • t 不是一个标量,但出于我的目的。正如我在帖子中所说,它是一个时间向量,例如,t=[0:0.0001:5]
  • 那为什么需要函数句柄呢?我不明白!我也不明白为什么ifft 不够好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多