1

我只是一个新手程序员,我需要一些帮助来解决这个问题。

我目前正在模拟在二维晶格上相互作用和移动的粒子。粒子在任何点的位置数据存储在我在模拟过程中使用的二维数组中。模拟之后,我希望能够直观地看到所有粒子的最终位置。目前,我将数据发送到 MATLAB,并让它在图形上绘制每个粒子。这有效,并创建了我的系统配置的“图片”。但是,对于大晶格中的大量粒子(尺寸为 600 个粒子宽 x 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])
4

1 回答 1

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来获取 x 和 y 坐标p

[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)

这将对您的点进行不同的颜色编码,但您可以将颜色图更改为您想要的任何颜色

于 2013-01-11T22:43:45.283 回答