首页 > 解决方案 > 在matlab中使用for循环和矩阵乘法实现一个函数

问题描述

我的目标是实现一个在 matlab 中执行傅立叶合成的函数,作为学习语言的一部分。该函数实现以下表达式:

y = sum(ak*exp((i*2*pi*k*t)/T)

其中 k 是索引,ak 是傅立叶系数向量,t 是采样时间的时间向量,T 是信号的周期。

我尝试过这样的事情:

for counter = -N:1:N
    k = y+N+1;
    y(k) = ak(k)*exp((i*2*pi*k*t)/T);
        % y is a vector of length 2N+1
end

但是,这给了我一个错误,即双方的项目数量不相等。这对我来说很有意义,因为 t 是一个任意长度的向量,因此我试图使 y(k) 等于许多东西而不是一个东西。相反,我怀疑我需要尝试类似的东西:

for counter = -N:1:N
    k=y+N+1;
    for t = 0:1/fs:1
        %sum over t elements for exponential operation
    end
    %sum over k elements to generate y(k)
end

但是,我应该能够使用纯矩阵乘法来实现这一点。我怎么能这样做?我试图了解 Matlab 正在做什么,但老实说,它与我所知道的其他语言相去甚远,以至于我对 matlab 在幕后所做的事情一无所知。了解如何在矩阵运算和 for 循环中的运算之间进行转换将非常有帮助。

标签: matlab

解决方案


您可以使用kron没有循环来达到您的目标for,即矩阵表示:

y = a*exp(1j*2*pi*kron(k.',t)/T);

其中akt假定为行向量

例子

N = 3;
k = -N:N;
t = 1:0.5:5;
T = 15;
a = 1:2*N+1;
y = a*exp(1j*2*pi*kron(k.',t)/T);

这样

y =

 Columns 1 through 6:

   19.1335 +  9.4924i   10.4721 + 10.6861i    2.0447 +  8.9911i   -4.0000 +  5.1962i   -6.4721 +  0.7265i   -5.4611 -  2.8856i

 Columns 7 through 9:

   -2.1893 -  4.5489i    1.5279 -  3.9757i    4.0000 -  1.7321i

推荐阅读