MATLABのTips 古いMATLABでgifアニメーションを作る方法

はじめに

MATLABマニアの方は定期的に新しいバージョンのMATLABを購入している方もいると思います。また、大学のような研究機関では包括契約で、常に最新バージョンが使えるかと思います。

ただ、個人使用の方や企業で買い切りのライセンスを保有している場合、古いバージョン(例えばMATLAB2007)が使えるまでは使い続ける、という方も多いと思います。

会社では最新のMATLABを使用しているので、最新のMATLABが便利なのは重々承知していますが、プライベートではMATLAB2007を使用しています。

最新のMATLABの関数で簡単にできることを、MATLAB2007では自力でコーディングする必要があります。

振動や音響の数値解析は、行列計算がメインなので、ここでは古いバージョンでも特に問題がないと思います。解析結果で重要となる「結果の見せ方」には古いバージョンだと課題が多いです。

特に古いMATLABだとアニメーション作成がうまくいかないですよね。
アニメーションは色々なファイル形式がありますが、パワーポイントなどのプレゼン資料で安定して動くgif形式で作成したい方が多いと思います。

古いMATLABを使っている方で、gifアニメーションを作る場合、下記のようなコーディングをしていると思います。(私はあまりお勧めしません)

スポンサーリンク

gifアニメーションのコード

一般的なコード

clear all
x=0:0.01:2*pi;
figure(1)
plot(x,sin(x))
k = 0:0.1:2*pi;
fn=1;
filename='GifExample.gif';
DelayTime=0.2;
for ii1=1:length(k)
    plot(x,sin(x+k(ii1))) % 新たなグラフィックスを描画
drawnow
frame = getframe(fn);
im = frame2im(frame);
[A,map] = rgb2ind(im,256); 
if ii1 == 1;
		imwrite(A,map,filename,'gif','LoopCount',Inf,'DelayTime',DelayTime);
else
		imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',DelayTime);
end

    % Gif_MovieMaker(1,1,0.5,'GifExample.gif');

% clf
end

この方法だと、wiin10の環境によってはgifアニメーションが再生できないことや、動画のフレーム数が多い場合に使用するメモリが大きくなってしまうなどの課題があります。ちなみに、出力されるgifは下記です。

スポンサーリンク

オススメの方法

上記の課題を解決する方法として、フリーソフトの「GraphicsMagick」を使用する方法があります。

GraphicsMagick Image Processing System
GraphicsMagick is a robust collection of tools and libraries to read, write, and manipulate an image in any of the more popular image formats including GIF, JPE...

(私が使用しているバージョンは”GraphicsMagick-1.3.36-Q16-win64-dll.exe”でした)

私のオススメはとりあえずアニメーションにしたいフレーム(図)を1つ1つpngなどの図として保存して、最後にgifアニメーションを作る方法です。
(実行して検証したい場合、上記の「GraphicsMagick」をインストールしておいてください。)

clear all;close all;clc

x=-2:0.1:2;
y=-2:0.1:2;
rho=1.293;
A=1;
c=340; %音速
freq=100; %周波数
w=2*pi*freq;
k=w/c;

t=(0:0.1:2*pi)/w;

P=zeros(length(y),length(x));
for ii1=1:length(x)
    for ii2=1:length(y)
        r=sqrt(x(ii1)^2+y(ii2)^2);
        if r<0.1
            r=0.1; %r=0の時にP(ii1,ii2)が無限大になるのを防ぐ目的
        end
        P(ii2,ii1)=j*w*rho*A./(4*pi*r).*exp(j*(k*r));
    end
end


t=(0:0.7:2*pi)/w;
for ii1=1:length(t)
clf
surf(x,y,real( P*exp(j*(-w*t(ii1))) ))
shading interp
ylabel('X [m]')
xlabel('Y [m]')
view([0 90])
% pause(0.1)
saveas(gcf,[num2str(ii1+100) '.png'],'png')
end

[status,cmdout]=dos(['gm convert -delay 1 -loop 0 *.png' ' b.gif'],'-echo');

この部分がgifアニメーションを作るコードです。

[status,cmdout]=dos(['gm convert -delay 1 -loop 0 *.png' ' b.gif'],'-echo');

ちなみに、図のファイル名を下記のように101から始めるようにしているのは、桁数が変わると、アニメーションの順番がおかしくなることがあるからです。あらかじめ大きい数字にしておくことで、そのエラーを避けることができます。

saveas(gcf,[num2str(ii1+100) '.png'],'png')

このコードで作成されるgifアニメーションは下記です。

スポンサーリンク

 

今回はこのへんでGood luck

コメント