1

私は初心者のプログラマーにすぎません。この問題について助けてください。

私は現在、二次元格子上で相互作用して動き回る粒子のシミュレーションを実行しています。パーティクルが任意のポイントにある場所のデータは、シミュレーション自体で使用する 2 次元配列に保存されます。シミュレーション後、すべてのパーティクルがどこに到達するかを視覚的に確認できるようにしたいと考えています。現在、データを MATLAB に送信し、文字どおり各粒子を Figure にプロットします。これは機能し、システム構成の「写真」を作成します。ただし、大きな格子 (幅 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])
4

1 に答える 1

0

ループの代わりに論理条件を使用してコードをベクトル化できます。たとえば、はとz=(particles==0)のベクトルで、粒子の要素 = 0の値を取得します。これはコードを置き換えます:011

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 に答える