从给定函数生成周期函数
generate periodic function from given function
假设从给定的函数f(t),我们想构造新的函数,它是通过这种方式从现有函数给出的
其中 T 是某个常数假设 T=3;当然现实中k不可能从-infinity到infinity因为我们不能用电脑做无穷大求和所以首先是我负担得起的
首先让我们定义我们的函数
function y=f(t);
y=-1/(t^2);
end
和第二个节目
k=-1000:1:999;
F=zeros(1,length(k));
T=3;
for t=1:length(k)
F(t)=sum(f(t+k*T));
end
但是当我运行第二个程序时,我得到
>> program
Error using ^
Inputs must be a scalar and a square matrix.
To compute elementwise POWER, use POWER (.^) instead.
Error in f (line 2)
y=-1/(t^2);
Error in program (line 5)
F(t)=sum(f(t+k*T));
所以我有两个与此程序相关的问题:
1.first 是什么错误为什么显示我错误
- 如何在 excel 中完成?我能以某种方式简化它吗?提前致谢
已编辑:
我已经通过这种方式更改了我的代码
k=-1000:1:999;
F=zeros(1,length(k));
T=3;
for t=1:length(k)
result=0;
for l=1:length(k)
result=result+f(t+k(l)*T);
end
F(t)=result;
end
可以吗?
要以向量化的方式解决您的问题,您必须更改函数 f
以便可以使用向量作为输入来调用它。正如@patrik 所建议的,这是通过使用元素运算符 .* ./ .^
(Afaik,不存在 .+ .-
) 来实现的。不幸的是,@rayryeng 的评论并不完全正确,这可能会导致混淆。正确的方法是对除法 ./
和 正方形 .^
:
使用元素运算符
function y = f(t)
y = -1 ./ (t.^2);
end
您现有的代码(第一个版本)
k = -1000:1:999;
F = zeros(1,length(k));
T = 3;
for t=1:length(k)
F(t) = sum(f(t+k*T));
end
然后按预期工作(并且比您在编辑中发布的版本快得多)。
您甚至可以消除 for 循环并使用 arrayfun
instead. For simple functions f
, you can also use function handles 而不是创建单独的文件。这给出
f = @(t) -1 ./ (t.^2);
k = -1000:1:999;
t = 1:2000;
T = 3;
F = arrayfun(@(x)sum(f(x+k*T)), t);
而且速度更快,而且是一种简单的单行代码。 arrayfun
将任何函数句柄作为第一个输入。我们创建一个函数句柄,它接受一个参数 x
并对所有 k
: @(x) sum(f(x+k*T)
求和。第二个参数,向量 t
,包含计算函数句柄的所有值。
正如@Divakar 在评论中提出的,您还可以使用bsxfun
函数:
f = @(t) -1 ./ (t.^2);
k = -1000:1:999;
t = 1:2000;
T = 3;
F = sum(f(bsxfun(@plus,k*T,t.')),2);
其中 bsxfun
创建一个矩阵,其中包含 t
和 k*T
之间的所有组合,它们都使用 f(...)
和最后的 sum
进行评估第二个维度对所有 k
求和。
基准测试
让我们比较这些解决方案:
for
循环和sum
的组合(原题):
Elapsed time is 0.043969 seconds.
在 2 for
循环中遍历所有组合(已编辑的问题):
Elapsed time is 1.367181 seconds.
矢量化方法 arrayfun
:
Elapsed time is 0.063748 seconds.
@Divakar 提出的 bsxfun
向量化方法:
Elapsed time is 0.099399 seconds.
所以(遗憾的是)包含 for
循环的第一个解决方案击败了两种矢量化方法。对于较大的 k
向量 (-10000:1:9999
),可以重现此行为。结论似乎是MATLAB确实学会了如何优化for
循环
假设从给定的函数f(t),我们想构造新的函数,它是通过这种方式从现有函数给出的
其中 T 是某个常数假设 T=3;当然现实中k不可能从-infinity到infinity因为我们不能用电脑做无穷大求和所以首先是我负担得起的
首先让我们定义我们的函数
function y=f(t);
y=-1/(t^2);
end
和第二个节目
k=-1000:1:999;
F=zeros(1,length(k));
T=3;
for t=1:length(k)
F(t)=sum(f(t+k*T));
end
但是当我运行第二个程序时,我得到
>> program
Error using ^
Inputs must be a scalar and a square matrix.
To compute elementwise POWER, use POWER (.^) instead.
Error in f (line 2)
y=-1/(t^2);
Error in program (line 5)
F(t)=sum(f(t+k*T));
所以我有两个与此程序相关的问题:
1.first 是什么错误为什么显示我错误
- 如何在 excel 中完成?我能以某种方式简化它吗?提前致谢
已编辑:
我已经通过这种方式更改了我的代码
k=-1000:1:999;
F=zeros(1,length(k));
T=3;
for t=1:length(k)
result=0;
for l=1:length(k)
result=result+f(t+k(l)*T);
end
F(t)=result;
end
可以吗?
要以向量化的方式解决您的问题,您必须更改函数 f
以便可以使用向量作为输入来调用它。正如@patrik 所建议的,这是通过使用元素运算符 .* ./ .^
(Afaik,不存在 .+ .-
) 来实现的。不幸的是,@rayryeng 的评论并不完全正确,这可能会导致混淆。正确的方法是对除法 ./
和 正方形 .^
:
function y = f(t)
y = -1 ./ (t.^2);
end
您现有的代码(第一个版本)
k = -1000:1:999;
F = zeros(1,length(k));
T = 3;
for t=1:length(k)
F(t) = sum(f(t+k*T));
end
然后按预期工作(并且比您在编辑中发布的版本快得多)。
您甚至可以消除 for 循环并使用 arrayfun
instead. For simple functions f
, you can also use function handles 而不是创建单独的文件。这给出
f = @(t) -1 ./ (t.^2);
k = -1000:1:999;
t = 1:2000;
T = 3;
F = arrayfun(@(x)sum(f(x+k*T)), t);
而且速度更快,而且是一种简单的单行代码。 arrayfun
将任何函数句柄作为第一个输入。我们创建一个函数句柄,它接受一个参数 x
并对所有 k
: @(x) sum(f(x+k*T)
求和。第二个参数,向量 t
,包含计算函数句柄的所有值。
正如@Divakar 在评论中提出的,您还可以使用bsxfun
函数:
f = @(t) -1 ./ (t.^2);
k = -1000:1:999;
t = 1:2000;
T = 3;
F = sum(f(bsxfun(@plus,k*T,t.')),2);
其中 bsxfun
创建一个矩阵,其中包含 t
和 k*T
之间的所有组合,它们都使用 f(...)
和最后的 sum
进行评估第二个维度对所有 k
求和。
基准测试
让我们比较这些解决方案:
for
循环和sum
的组合(原题):Elapsed time is 0.043969 seconds.
在 2
for
循环中遍历所有组合(已编辑的问题):Elapsed time is 1.367181 seconds.
矢量化方法
arrayfun
:Elapsed time is 0.063748 seconds.
@Divakar 提出的
bsxfun
向量化方法:Elapsed time is 0.099399 seconds.
所以(遗憾的是)包含 for
循环的第一个解决方案击败了两种矢量化方法。对于较大的 k
向量 (-10000:1:9999
),可以重现此行为。结论似乎是MATLAB确实学会了如何优化for
循环