从 for 循环中的绘图中提取数据
Extracting data from a plot within a for loop
在 MATLAB 中,我为一个简单的出生-死亡过程编写了随机模拟算法 (Gillespie),并通过在 for
循环中使用 hold on
得到了一个图。
每个 Qp
值我有 100 个 PStoch
值,因为每个 Qp
值我有 运行 100 个模拟。在下图中很难看到这些值,因为它们都聚集在一起。
如何将绘图中的数据保存在矩阵中,以便之后对它们进行一些计算?具体来说,我需要一个大小为 100 x 100 的矩阵,其中所有 PStoch
值对应于每个 Qp
值。
我的代码如下:
rng('shuffle')
%% Pre-defined variables
Qpvec = logspace(-2,1,100);
len = length(Qpvec);
delta = 1e-3;
P0vec = Qpvec./delta;
V = [1,-1];
tmax = 10000;
%% Begin simulation
figure(1)
for k = 1:len
t0 = 0;
tspan = t0;
Qp = Qpvec(k);
P0 = P0vec(k);
Pstoch = P0;
while t0 < tmax && length(Pstoch) < 100
a = [Qp, delta*P0];
tau = -log(rand)/sum(a);
t0 = t0 + tau;
asum = cumsum(a)/sum(a);
chosen_reaction = find(rand < asum,1);
if chosen_reaction == 1;
P0 = P0 + V(:,1);
else
P0 = P0 + V(:,2);
end
tspan = [tspan,t0];
Pstoch = [Pstoch;P0];
end
plot(Qp,Pstoch)
hold on
axis([0 max(Qp) 0 max(Pstoch)])
end
剧情在这里:
感谢您的帮助。
我在下面的代码中添加了三行。这假设你说 Pstoch
总是有 100 个元素(或少于 100 个)是正确的:
Pstoch_M = zeros(len, 100)
for
k = 1:len
t0 = 0;
tspan = t0;
Qp = Qpvec(k);
P0 = P0vec(k);
Pstoch = zeros(100,1);
counter = 1;
Pstoch(1) = P0;
while t0 < tmax && counter < 100 %// length(Pstoch) < 100
a = [Qp, delta*P0];
tau = -log(rand)/sum(a);
t0 = t0 + tau;
asum = cumsum(a)/sum(a);
chosen_reaction = find(rand < asum,1);
if chosen_reaction == 1;
P0 = P0 + V(:,1);
else
P0 = P0 + V(:,2);
end
counter = counter + 1;
tspan = [tspan,t0];
Pstoch(counter) P0;;
end
Pstock_M(:,k) = Pstoch;
plot(Qp,Pstoch)
hold on
axis([0 max(Qp) 0 max(Pstoch)])
end
请注意,为 Pstoch
添加的预分配应该会使您的代码更快。您应该对 tspan
执行相同的操作。在 MATLAB 的循环内增加变量效率极低,因为 m-lint 无疑正在警告您。
在 MATLAB 中,我为一个简单的出生-死亡过程编写了随机模拟算法 (Gillespie),并通过在 for
循环中使用 hold on
得到了一个图。
每个 Qp
值我有 100 个 PStoch
值,因为每个 Qp
值我有 运行 100 个模拟。在下图中很难看到这些值,因为它们都聚集在一起。
如何将绘图中的数据保存在矩阵中,以便之后对它们进行一些计算?具体来说,我需要一个大小为 100 x 100 的矩阵,其中所有 PStoch
值对应于每个 Qp
值。
我的代码如下:
rng('shuffle')
%% Pre-defined variables
Qpvec = logspace(-2,1,100);
len = length(Qpvec);
delta = 1e-3;
P0vec = Qpvec./delta;
V = [1,-1];
tmax = 10000;
%% Begin simulation
figure(1)
for k = 1:len
t0 = 0;
tspan = t0;
Qp = Qpvec(k);
P0 = P0vec(k);
Pstoch = P0;
while t0 < tmax && length(Pstoch) < 100
a = [Qp, delta*P0];
tau = -log(rand)/sum(a);
t0 = t0 + tau;
asum = cumsum(a)/sum(a);
chosen_reaction = find(rand < asum,1);
if chosen_reaction == 1;
P0 = P0 + V(:,1);
else
P0 = P0 + V(:,2);
end
tspan = [tspan,t0];
Pstoch = [Pstoch;P0];
end
plot(Qp,Pstoch)
hold on
axis([0 max(Qp) 0 max(Pstoch)])
end
剧情在这里:
感谢您的帮助。
我在下面的代码中添加了三行。这假设你说 Pstoch
总是有 100 个元素(或少于 100 个)是正确的:
Pstoch_M = zeros(len, 100)
for
k = 1:len
t0 = 0;
tspan = t0;
Qp = Qpvec(k);
P0 = P0vec(k);
Pstoch = zeros(100,1);
counter = 1;
Pstoch(1) = P0;
while t0 < tmax && counter < 100 %// length(Pstoch) < 100
a = [Qp, delta*P0];
tau = -log(rand)/sum(a);
t0 = t0 + tau;
asum = cumsum(a)/sum(a);
chosen_reaction = find(rand < asum,1);
if chosen_reaction == 1;
P0 = P0 + V(:,1);
else
P0 = P0 + V(:,2);
end
counter = counter + 1;
tspan = [tspan,t0];
Pstoch(counter) P0;;
end
Pstock_M(:,k) = Pstoch;
plot(Qp,Pstoch)
hold on
axis([0 max(Qp) 0 max(Pstoch)])
end
请注意,为 Pstoch
添加的预分配应该会使您的代码更快。您应该对 tspan
执行相同的操作。在 MATLAB 的循环内增加变量效率极低,因为 m-lint 无疑正在警告您。