Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 我可以做些什么来缩短代码?_Arrays_Matlab_Performance_Plot_Matlab Figure - Fatal编程技术网

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个数组(其中一个可以是标量数组),第一个数组保存函数中第一个参数的所有值,第二个数组保存第二个参数的所有值。如果其中一个数组有一个单件维度,而另一个维度大于一个,则than
bsxfun
会扩展较小的维度以适应较大的维度。在我们的例子中,
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个数组(其中一个可以是标量数组),第一个数组保存函数中第一个参数的所有值,第二个数组保存第二个参数的所有值。如果其中一个数组有一个单件维度,而另一个维度大于一个,则than
bsxfun
会扩展较小的维度以适应较大的维度。在我们的例子中,
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],'.')

如果您的代码正在运行,但您希望对其进行优化,请尝试代码审阅。上面的注释是指“不工作”?这就是你应该告诉别人你尝试了什么,没有成功,以及你收到的错误信息。还要熟悉循环文档,尤其是循环文档。如果您的代码正常工作,但希望对其进行优化,请尝试代码复查。上面的注释是指“不工作”吗?这就是你应该告诉别人你尝试了什么,没有成功,以及你收到的错误信息。还要熟悉循环的文档,尤其是