matlab - 在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 循环中的运算之间进行转换将非常有帮助。
解决方案
您可以使用kron
没有循环来达到您的目标for
,即矩阵表示:
y = a*exp(1j*2*pi*kron(k.',t)/T);
其中a
和k
都t
假定为行向量
例子
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
推荐阅读
- mysql - MySql:如何按 2 个特定类别然后按价格对查询进行排序?
- python - 如何选择列表元素列表并在单个数据框中创建不同的列?
- python - 如何将 lambda 函数应用于多列
- python - 如何从按月分区的镶木地板文件中删除特定月份
- c# - 使用循环填充二维数组
- r - 如何从值的范围中找到给定的值?
- docker - apache/nifi docker:如何提交对新容器的更改
- nuxt.js - asyncData 获取未定义的参数
- laravel - 路线 [产品/产品] 未定义。(看法:
- javascript - ${__RandomString(10,195165984,)} 放在 Jmeter 外部的脚本文件中然后调用它时不起作用