如何矢量化 MATLAB 中的慢速代码以提高性能?
How can I vectorize slow code in MATLAB to increase peformance?
如何向量化此代码?目前它运行得很慢。我真的被卡住了,我花了最后几个小时试图对其进行矢量化,但我似乎无法让它正常工作。
我下面的幼稚程序运行得非常慢。 N
确实应该是 10,000,但程序正在努力处理 N = 100
。任何意见,将不胜感激。
代码想要为每个值 w21
迭代给定 N
次的函数。然后它为 w21
的每个值绘制最后 200 个值。下面的代码在情节方面确实按预期工作,但正如所提到的那样慢得多,因为对于一个好的情节,值需要以千为单位。
hold on
% Number of iterations
N = 100;
x = 1;
y = 1;
z = 1;
for w21 = linspace(-12,-3,N)
for i = 1:N-1
y = y_iterate(x,z,w21);
z = z_iterate(y);
x = x_iterate(y);
if i >= (N - 200)
p = plot(w21,x,'.k','MarkerSize',3);
end
end
end
所需功能:
function val = x_iterate(y)
val = -3 + 8.*(1 ./ (1 + exp(-y)));
end
function val = z_iterate(y)
val = -7 + 8.*(1 ./ (1 + exp(-y)));
end
function val = y_iterate(x,z,w21)
val = 4 + w21.*(1 ./ (1 + exp(-x))) + 6.*(1 ./ (1 + exp(-z)));
end
我认为这是因为 plot
。尝试:
[X,Y,Z] = deal( zeros(N,N-1) );
w21 = linspace(-12,-3,N);
for i = 1:N
for j = 1:N-1
y = y_iterate(x,z,w21(i));
z = z_iterate(y);
x = x_iterate(y);
X(i,j) = x;
Y(i,j) = y;
Z(i,j) = z;
end
end
nn = max(1,N-200);
plot(w21,X(nn:end,:),'.k')
如何向量化此代码?目前它运行得很慢。我真的被卡住了,我花了最后几个小时试图对其进行矢量化,但我似乎无法让它正常工作。
我下面的幼稚程序运行得非常慢。 N
确实应该是 10,000,但程序正在努力处理 N = 100
。任何意见,将不胜感激。
代码想要为每个值 w21
迭代给定 N
次的函数。然后它为 w21
的每个值绘制最后 200 个值。下面的代码在情节方面确实按预期工作,但正如所提到的那样慢得多,因为对于一个好的情节,值需要以千为单位。
hold on
% Number of iterations
N = 100;
x = 1;
y = 1;
z = 1;
for w21 = linspace(-12,-3,N)
for i = 1:N-1
y = y_iterate(x,z,w21);
z = z_iterate(y);
x = x_iterate(y);
if i >= (N - 200)
p = plot(w21,x,'.k','MarkerSize',3);
end
end
end
所需功能:
function val = x_iterate(y)
val = -3 + 8.*(1 ./ (1 + exp(-y)));
end
function val = z_iterate(y)
val = -7 + 8.*(1 ./ (1 + exp(-y)));
end
function val = y_iterate(x,z,w21)
val = 4 + w21.*(1 ./ (1 + exp(-x))) + 6.*(1 ./ (1 + exp(-z)));
end
我认为这是因为 plot
。尝试:
[X,Y,Z] = deal( zeros(N,N-1) );
w21 = linspace(-12,-3,N);
for i = 1:N
for j = 1:N-1
y = y_iterate(x,z,w21(i));
z = z_iterate(y);
x = x_iterate(y);
X(i,j) = x;
Y(i,j) = y;
Z(i,j) = z;
end
end
nn = max(1,N-200);
plot(w21,X(nn:end,:),'.k')