Arrays 我可以做些什么来缩短代码?
我想计算更多的Arrays 我可以做些什么来缩短代码?,arrays,matlab,performance,plot,matlab-figure,Arrays,Matlab,Performance,Plot,Matlab Figure,我想计算更多的k函数,比如k=6,7,8…等等: f(k,a)=(-1)ka-(-1)k(kπ/t)2 然后我想为所有k绘制它。我只想要短一点的。我试着把k写成一个向量,但是没有用。这是我的密码: clear all close all clc w = linspace(-1,10,5000); t = 2*pi; k = 0; a0 = w.^2; b0 = (-1).^k.*a0-((-1).^k).*(k*pi/t).^2; b = a0*0; k1 = 1; a01 = w.^2; b
k
函数,比如k=6,7,8…
等等:
f(k,a)=(-1)ka-(-1)k(kπ/t)2
然后我想为所有k
绘制它。我只想要短一点的。我试着把k
写成一个向量,但是没有用。这是我的密码:
clear all
close all
clc
w = linspace(-1,10,5000);
t = 2*pi;
k = 0;
a0 = w.^2;
b0 = (-1).^k.*a0-((-1).^k).*(k*pi/t).^2;
b = a0*0;
k1 = 1;
a01 = w.^2;
b01 = (-1).^k1.*a01-((-1).^k1).*(k1*pi/t).^2;
k2 = 2;
a02 = w.^2;
b02 = (-1).^k2.*a02-((-1).^k2).*(k2*pi/t).^2;
k3 = 3;
a03 = w.^2;
b03 = (-1).^k3.*a03-((-1).^k3).*(k3*pi/t).^2;
k4 = 4;
a04 = w.^2;
b04 = (-1).^k4.*a04-((-1).^k4).*(k4*pi/t).^2;
k5 = 5;
a05 = w.^2;
b05 = (-1).^k5.*a05-((-1).^k5).*(k5*pi/t).^2;
plot(a0,b,'.')
hold on
plot(a0,b0,'.')
hold on
grid on
plot(a01,b01,'.')
您可以从编程中的函数定义中获益。可以这样做:
function main
w=linspace(-1,10,5000);
t=2*pi;
figure;hold on
for k=0:5
[a,b] = getNext(k,w,t);
plot(a,b,'.');
end
function [a,b] = getNext(k,w,t)
a = w.^2;
b = (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
end
end
记住,这不是唯一的解决方案。获得类似结果的其他方法也是可能的
更新
使用arrayfun
的内置for循环如下所示:
w = linspace(-1,10,5000);
t = 2*pi;
a = w.^2;
K = [0 1 2 3 4 5 6 7];
S = arrayfun(@(k)((-1).^k.*a-((-1).^k).*(k*pi/t).^2),K,'UniformOutput',false);
figure;hold on
for ii=1:numel(K)
plot(a,S{ii},'.');
end
您可以从编程中的函数定义中获益。可以这样做:
function main
w=linspace(-1,10,5000);
t=2*pi;
figure;hold on
for k=0:5
[a,b] = getNext(k,w,t);
plot(a,b,'.');
end
function [a,b] = getNext(k,w,t)
a = w.^2;
b = (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
end
end
记住,这不是唯一的解决方案。获得类似结果的其他方法也是可能的
更新
使用arrayfun
的内置for循环如下所示:
w = linspace(-1,10,5000);
t = 2*pi;
a = w.^2;
K = [0 1 2 3 4 5 6 7];
S = arrayfun(@(k)((-1).^k.*a-((-1).^k).*(k*pi/t).^2),K,'UniformOutput',false);
figure;hold on
for ii=1:numel(K)
plot(a,S{ii},'.');
end
tl;dr-这是一种紧凑的矢量化方式:
t = 2*pi;
myfun = @(k,a) (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
k = 0:30; % here you can add as many k's you like
w = linspace(-1,10,5000).^2.';
b0 = zeros(size(w));
B = bsxfun(myfun,k,w);
plot(w,[b0 B],'.')
grid on
k = 0:5
B = bsxfun(b_fun,k,a.');
结果是:
解释:
您的代码演示了如何不使用变量。如果a01==a02==a03…
那么您可以对所有的a
使用,而不需要定义所有的a
。对于函数b0
、b01
等,同样适用,您可以定义一个匿名函数(最短类型的函数)来完成此操作,并反复调用它。如果您只做这两件事,您上面的代码(不打印)将变成:
它更简短,可读性更强。请注意,我们在函数之前定义了t
,因此它是通过函数中的值来计算的
接下来,您可以使用一个命令(并以矢量化方式)计算a
和k
中元素的所有成对组合:
这将创建一个矩阵,其中每列都是b_-fun(k(i),a)
的所有结果值。bsxfun
的第一个输入是任何按元素的二进制操作,就像我们的函数b_fun
一样。接下来总是有2个数组(其中一个可以是标量数组),第一个数组保存函数中第一个参数的所有值,第二个数组保存第二个参数的所有值。如果其中一个数组有一个单件维度,而另一个维度大于一个,则thanbsxfun
会扩展较小的维度以适应较大的维度。在我们的例子中,k
在行中是单例的,a
在列中是单例的,因此结果有k
中的列数和a
中的行数
到目前为止,我们得到:
w = linspace(-1,10,5000);
t = 2*pi;
b_fun = @(k,a) (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
a = w.^2;
k = 0:5;
B = bsxfun(b_fun,k,a.');
b = a*0;
我们可以进一步删除一些重复变量-使用w.^2
而不是a
,并用0.5
替换常量pi/t
。另外,写b=0(大小(w))
比写a*0
更清楚:
w = linspace(-1,10,5000).';
b_fun = @(k,a) (-1).^k.*a-((-1).^k).*(k*0.5).^2;
k = 0:5;
B = bsxfun(b_fun,k,w.^2);
b = zeros(size(w));
现在开始策划plot
可以在一个矩阵的列中获取多个系列的数据,并针对同一变量显示所有数据,因此我们可以直接使用我们的B
,只需将其浓缩到B
:
plot(w.^2,[b B],'.')
tl;dr-这是一种紧凑的矢量化方式:
t = 2*pi;
myfun = @(k,a) (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
k = 0:30; % here you can add as many k's you like
w = linspace(-1,10,5000).^2.';
b0 = zeros(size(w));
B = bsxfun(myfun,k,w);
plot(w,[b0 B],'.')
grid on
k = 0:5
B = bsxfun(b_fun,k,a.');
结果是:
解释:
您的代码演示了如何不使用变量。如果a01==a02==a03…
那么您可以对所有的a
使用,而不需要定义所有的a
。对于函数b0
、b01
等,同样适用,您可以定义一个匿名函数(最短类型的函数)来完成此操作,并反复调用它。如果您只做这两件事,您上面的代码(不打印)将变成:
它更简短,可读性更强。请注意,我们在函数之前定义了t
,因此它是通过函数中的值来计算的
接下来,您可以使用一个命令(并以矢量化方式)计算a
和k
中元素的所有成对组合:
这将创建一个矩阵,其中每列都是b_-fun(k(i),a)
的所有结果值。bsxfun
的第一个输入是任何按元素的二进制操作,就像我们的函数b_fun
一样。接下来总是有2个数组(其中一个可以是标量数组),第一个数组保存函数中第一个参数的所有值,第二个数组保存第二个参数的所有值。如果其中一个数组有一个单件维度,而另一个维度大于一个,则thanbsxfun
会扩展较小的维度以适应较大的维度。在我们的例子中,k
在行中是单例的,a
在列中是单例的,因此结果有k
中的列数和a
中的行数
到目前为止,我们得到:
w = linspace(-1,10,5000);
t = 2*pi;
b_fun = @(k,a) (-1).^k.*a-((-1).^k).*(k*pi/t).^2;
a = w.^2;
k = 0:5;
B = bsxfun(b_fun,k,a.');
b = a*0;
我们可以进一步删除一些重复变量-使用w.^2
而不是a
,并用0.5
替换常量pi/t
。另外,写b=0(大小(w))
比写a*0
更清楚:
w = linspace(-1,10,5000).';
b_fun = @(k,a) (-1).^k.*a-((-1).^k).*(k*0.5).^2;
k = 0:5;
B = bsxfun(b_fun,k,w.^2);
b = zeros(size(w));
现在开始策划plot
可以在一个矩阵的列中获取多个系列的数据,并针对同一变量显示所有数据,因此我们可以直接使用我们的B
,只需将其浓缩到B
:
plot(w.^2,[b B],'.')
如果您的代码正在运行,但您希望对其进行优化,请尝试代码审阅。上面的注释是指“不工作”?这就是你应该告诉别人你尝试了什么,没有成功,以及你收到的错误信息。还要熟悉循环文档,尤其是循环文档。如果您的代码正常工作,但希望对其进行优化,请尝试代码复查。上面的注释是指“不工作”吗?这就是你应该告诉别人你尝试了什么,没有成功,以及你收到的错误信息。还要熟悉循环的文档,尤其是