我只是一名新手程序员,我想帮助解决这个问题。
我目前正在运行在二维点阵上相互作用和移动的粒子模拟。粒子在任何点的位置数据存储在我在模拟过程中使用的二维数组中。模拟后,我希望能够直观地看到所有粒子的最终位置。目前,我将数据发送到MATLAB,并将其逐字地绘制在图形上。这可以工作,并创建我的系统配置的“图片”。然而,对于大格子中的大量粒子(尺寸像600个粒子宽,1200个粒子高),这使得图像处理速度过慢,MATLAB和文字处理处理速度非常慢,并且占用了很多记忆和空间。
必须有更好的方法来做到这一点,是否有人对更好地查看我的系统或控制数据有任何想法?
我的matlab代码如下:
%--------------------------------------- Particle Picture
clc; clear all;
particle_file = fopen('ABC_Particles_600X1200T1.txt');
particles = fscanf(particle_file,'%f');
fclose(particle_file);
figure(3);
hold on;
sizex = 600;
sizey = 1200;
for a = 1:1:sizey*sizex
b = int32(a);
if particles(a) == 0
plot(mod(b,sizex)+1,idivide(b,sizex)+1,'c')
end
if particles(a) == 1
plot(mod(b,sizex)+1,idivide(b,sizex)+1,'r')
end
if particles(a) == 2
plot(mod(b,sizex)+1,idivide(b,sizex)+1,'k')
end
end
title('Size 600X1200; Time T = 1')
axis([0 sizex 0 sizey])
答案 0 :(得分:0)
您可以使用逻辑条件而不是循环来矢量化代码。例如,z=(particles==0)
是0
和1
的向量,您可以在其中获得值1
,其中粒子元素= 0。这取代了代码:
for a=1:n
if particles(a) == 0
z(a)=1
else
z(a)=0
end
end
所以,首先我们将particles
从长向量重构为矩阵:
p=reshape(particles,600,1200);
然后我们可以像以前一样使用逻辑条件,或类似地使用函数find
来根据你写的内容获得p
的x和y坐标
[x0 y0]=find(p==0);
[x1 y1]=find(p==1);
[x2 y2]=find(p==2);
然后我们可以绘制它:
plot(x0,y0,'c',x1,y1,'r',x2,y2,'k')
顺便说一句,如果0,1,2
是您的数据所具有的唯一值,则可以跳过所有这些并使用:
imagesc(p)
这将以不同方式对您的积分进行颜色编码,但您可以将colormap更改为您想要的任何内容