2011年12月23日

MATLAB 3次元アニメーションの簡単なやつ メモ


MATLAB 3次元アニメーションの簡単なやつ メモ

MATLABで3次元グラフのアニメーション

描画フレームを保存するやり方なのでメモリが気になる
加えて螺旋を描くが,軌跡を残すためデータも保存しているのでさらに窮屈

参考:
グラフィックスでアニメーションを行うことはできますか?
http://www.mathworks.co.jp/support/solutions/ja/data/1-9HNJJB/index.html?product=SL&solution=1-9HNJJB

フレームを行列を割り当てするときに使うmovieinについて
http://infoshako.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/jhelp/techdoc/ref/moviein.html

ファイル:anime.m


%% アニメーション
clear
clc;

T=4;
DIV = 100; %シミュレーション精度
t=0;
x=zeros(DIV*T+1,1);
y=zeros(DIV*T+1,1);
z=zeros(DIV*T+1,1);
F=moviein(DIV*T+1);

%%初期プロット
x(1,1)=cos(2*pi*t/T);
y(1,1)=sin(2*pi*t/T);
z(1,1)=t;
plot3(x, y, z, 'k');
axis equal % 軸範囲をデータ範囲に設定
axis([-1 1 -1 1 0 T]) % 軸の範囲

% 新しいプロットの時、
% 軸設定を保持したまま前のグラフィックスオブジェクトを消去
set(gca,'nextplot','replacechildren');

for i=1:1:DIV*T+1
%螺旋を描く
x(i,1)=cos(2*pi*t/T);
y(i,1)=sin(2*pi*t/T);
z(i,1)=t;

plot3(x(1:i,1), y(1:i,1), z(1:i,1), 'k') % 現在までのグラフを描画
F(i) = getframe; % フレームの取得
t = t+1/DIV;%0:1/DIV:4

end
movie(F, 2); %ムービーフレームをN回再生
ラベル:Matlab plot3
posted by CODE-440 at 04:50| Comment(0) | TrackBack(0) | MATLAB | このブログの読者になる | 更新情報をチェックする

2011年11月10日

MATLAB データを保存するクラス メモ


MATLAB データを保存するクラス メモ

オブジェクト指向とは

「ものごとで考えるプログラミング」

ある目的(処理)に関する,「もの(データ)」と「こと(関数)」をまとめて扱う.

このデータと関数をまとめたのがクラス.

という風に解釈した.

本題
まずファイルに保存するクラス
サンプルをいじって足した.
これを "@Filewriter"というフォルダの中に入れておけばよし


%% Filewriter.m
classdef Filewriter < handle
% Property data is private to the class
properties (SetAccess = private, GetAccess = private)
FileID
end % properties

methods
% Construct an object and
% save the file ID
function obj = Filewriter(filename)
obj.FileID = fopen(filename,'wt');
end

function writeToFile(obj,text_str)
fprintf(obj.FileID,'%s',text_str);
end

function writeHeader(obj, header_str)
%ヘッダー作成 エクセルグラフを作るときに便利
[rows,cols] = size(header_str);
for i = 1:rows
fprintf(obj.FileID, '%s\t', header_str{i,1:end-1}); % 文字列の書き出し
fprintf(obj.FileID, '%s\n', header_str{i,end}); % 行末の文字列は、改行を含めて出力
end
end
% Delete methods are always called before a object
% of the class is destroyed
function delete(obj)
fclose(obj.FileID);
end
end % methods
end % class



使うときは
カレントリレクトリに@Filewriterフォルダを置いた状態で以下のように使う


%% FileWriteTest.m
clear;
clc;

x = 0;
y = 0;
z = 0;

FileData1 = Filewriter('data1.txt');
header_str = {'count', 'x', 'y', 'z'};
writeHeader(FileData1, header_str);

sprintf('SIMULATION START')

for count=0:1:100
% 1 2 3 4
text_str = sprintf(' %d\t', count);
writeToFile(FileData1, text_str)
text_str = sprintf(' %f\t', x);
writeToFile(FileData1, text_str)
text_str = sprintf(' %f\t', y);
writeToFile(FileData1, text_str)
text_str = sprintf(' %f\n', z);
writeToFile(FileData1, text_str)
end

sprintf('SIMULATION END')


色々改良すべきところはあるがとりあえず使えるからよしとした
posted by CODE-440 at 17:45| Comment(0) | TrackBack(0) | MATLAB | このブログの読者になる | 更新情報をチェックする

MATLABでデータを保存するメモ 修正版


MATLABでデータを保存するメモ 修正版
修正前のはリンク先で(訂正してあるが)見れる
http://robotics440sblog.seesaa.net/article/232088354.html

%% データ保存プログラム
x = 0;
y = 0;
z = 0;

sprintf('SIMULATION START')
%ヘッダー作成 エクセルグラフを作るときに便利
str = {'count', 'x', 'y', 'z'}; % 文字列(セル配列)
%ヘッダーの書き出し
fid = fopen('data.txt','wt'); % 書き込み用にファイルオープン
[rows,cols] = size(str);
for i = 1:rows
fprintf(fid, '%s\t', str{i,1:end-1}); % 文字列の書き出し
fprintf(fid, '%s\n', str{i,end}); % 行末の文字列は、改行を含めて出力
end
fclose(fid); % ファイルクローズ

[fid, message] = fopen('data.txt', 'a'); %既存ファイルに書き加える
for count=0:1:100
% 1 2 3 4
fprintf(fid,' %d\t', count);
fprintf(fid,' %f\t', x);
fprintf(fid,' %f\t', y);
fprintf(fid,' %f\n', z);
end

status=fclose(fid);
sprintf('SIMULATION END')
ラベル:Matlab
posted by CODE-440 at 16:29| Comment(0) | TrackBack(0) | MATLAB | このブログの読者になる | 更新情報をチェックする

2011年10月25日

MATLABでデータを保存するメモ

MATLABでデータを保存するメモ

データを毎回書き込む.
シミュレーションが終わるまでデータを保持するとメモリが〜となるので逐次書き出す
あとエクセルで見やすいように保存する

以下ほぼサンプルをつなげただけ.

%% データ保存プログラム
x = 0;
y = 0;
phi = 0;
z = 0;

sprintf('SIMULATION START')
%ヘッダー作成 エクセルグラフを作るときに便利
str = {'count', 'x', 'y', 'φz'}; % 文字列(セル配列)
%ヘッダーの書き出し
fid = fopen('data.txt','wt'); % 書き込み用にファイルオープン
[rows,cols] = size(x);
[rows,cols] = size(str);
for i = 1:rows
fprintf(fid, '%s\t', str{i,1:end-1}); % 文字列の書き出し
fprintf(fid, '%s\n', str{i,end}); % 行末の文字列は、改行を含めて出力
end
fclose(fid); % ファイルクローズ

[fid, message] = fopen('data.txt', 'a'); %既存ファイルに書き加える
for count=0:1:100
% 1 2 3 4
fprintf(fid,' %d\t', count);
fprintf(fid,' %f\t', x);
fprintf(fid,' %f\t', y);
fprintf(fid,' %f\n', z);
end

status=fclose(fid);
sprintf('SIMULATION END')

ちょっと修正
ラベル:Matlab
posted by CODE-440 at 20:50| Comment(0) | TrackBack(0) | MATLAB | このブログの読者になる | 更新情報をチェックする

2011年07月22日

MATLAB 3次元可視化 メモ


MATLABで3次元グラフを表示するメモ

平面要素を用意する

x=[1,2,3];
y=[1,2,3];

3次元グラフの縦軸要素行列を考える.

横をxに対応する値,縦をyに対応する値にする.

[Z] = z_{x}{y} ※表現が下手なのでわかりにくい

言うならばzをf(x,y)という関数とすると

Z=[f(1,1), f(1,2), f(1,3);
f(2,1), f(2,2), f(2,3);
f(3,1), f(3,2), f(3,3)];

※これで伝わるのか?

まあそんな感じ

で実際はxとyの値を変換して使う.

[X, Y] = meshgrid(x, y); %3次元グラフ用に変換

surf(X, Y, Z); % これで3次元表示

基本は以上

その他オプション

colormap jet %カラーマップ
shading interp %シェーディングアルゴリズム

axis([-2 2 -2 2 0 0.25]) % 軸の範囲
set(gca,'PlotBoxAspectRatio',[1 1 0.5]) %縦横比
view([120 40]) %カメラ位置



ラベル:Matlab 3次元
posted by CODE-440 at 01:53| Comment(0) | TrackBack(0) | MATLAB | このブログの読者になる | 更新情報をチェックする

2011年07月17日

MATLABのデータ配列をファイル保存


MATLABのデータ配列をファイル保存する方法

ここでは以下のように

ファイル名: data_x_data.csv
データ名: x_data
データの区切り方(delimiter):\t

dlmwrite('data_x_data.csv', x_data,'delimiter','\t');

これでファイル名'data_x_data.csv'のファイルにx_dataを'delimiter','\t'で保存する.
ラベル:Matlab
posted by CODE-440 at 18:19| Comment(0) | TrackBack(0) | MATLAB | このブログの読者になる | 更新情報をチェックする

2010年06月22日

MATLABメモ


simulinkにおいて, m-ファイルに設定したパラメータをSimulinkモデルの起動と同時に読み込むには

ファイル→モデルプロパティ→コールバック→PreLoadFcn

でモデルプリロード関数を設定する

例えば, 同じファイル内の initMotor.m
を読み込みたければ

PreLoadFcnに以下のように設定する

PreLoadFcn.png

こうすると, mdlファイルを開くと同時に読み込んでくれる

今回は Motor.mdl で読み込むというミッションに使った

ラベル:Simulink Matlab
posted by CODE-440 at 17:30| Comment(0) | TrackBack(0) | MATLAB | このブログの読者になる | 更新情報をチェックする