大学の研究室でMATLABを使うことになりました。
先生に微分方程式をMATLABでできるようにしといてと
簡単に言われたのですが、プログラミングを一度もやったことがなく、
基礎の基礎から分かってないので一体どこから手をつけたらいいのか
困ってしまいました。
基本演習ができるようなお勧めの参考書、初めて勉強する際の注意事項、アドバイスなど何でもよいのでお答え願えませんでしょうか?

A 回答 (2件)

秀和システムの「最新MATLABハンドブック(小林一行著)」という本がとても分かりやすかったです。


あと、add on ですが、微分方程式を解くのならsimulinkがとても便利で簡単です。

matlabで使うファイル名やフォルダ名に日本語が入るとパスが通りません。注意してください。

あとは、プログラムの強制停止コマンド(ctrl + pause)を覚えておくと便利です。

下記サイトには日本語のヘルプがあります。
http://www.mathworks.co.jp/
    • good
    • 0

参考URLはなかなか役に立ちます。



本では「MATLAB早わかり」のんかいいですよ

http://www.amazon.co.jp/exec/obidos/ASIN/4320028 …

下記ページにはリンク集があり結構役に立ちます。

http://www-ics.acs.i.kyoto-u.ac.jp/~nagahara/mli …

参考URL:http://feedback.nagaokaut.ac.jp/matlab/matlab0.htm
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMATLABのプログラミングで

MATLABでプログラミングを行っているのですが、forを使い

for trt=1:rety(1);
xt2(trt,:)=xt1(trt):xt1(trt)+(x-1);
yt2(trt,:)=yt1(trt):yt1(trt)+(x-1);
end

for t3t=1:re/ysuu
torie(:,:,t33(:,t3t))=saweq(xt2(gjir1(trt),:),yt2(gjir1(trt),:),:);
end

この様な変数を作製しています。

上のアルゴリズムは a:b (a=1:10) (b=a+5) で複数の位置データを記録する物で、
下のアルゴリズムは画像データを重ね合わせる物です。
これらのアルゴリズムでforを使わずにより高速化できる方法があれば連絡をお願いします。

Aベストアンサー

xt1,yt1が rety(1)行、1列の縦ベクトルだとして、
xt2 = ones(rety(1),1)*(0:x-1) + xt1*ones(1,x);
yt2 = ones(rety(1),1)*(0:x-1) + yt1*ones(1,x);
とか。
もしかしたら早くならないかも。

QMATLABのプログラミングについてご質問です

MATLAB初心者です。

現在、以下の環境を使っています。
-------------------------------
OS:Windows XP
MATLABのバージョン:R2007a
-------------------------------

以下の内容をプログラムでどう組み込めばよいのか分らないため、質問させて頂きました。
詳しい方、ご教授のほどお願いします。

(1)Windowsのペイントで、ドラッグ&ドロップすると
   +----------+
   |         |
   +----------+
 このように、点線で枠ができると思います。それをMATLABで表現する方法
 (始点座標と終点座標はマウスで操作するため、座標は可変になります)

(2)MATLAB-GUIに画像データ(sample.tif)を表示する方法

(3)MATLAB-GUIを表示した時に、表示位置を常にパソコンのモニター中央にする方法

(4)MATLAB-GUIで画面A, Bとある場合、画面Aの[次へ]ボタンを押すと画面Aを消して画面Bを表示する方法

長くて申し訳ございませんが、ご回答よろしくお願いします。

MATLAB初心者です。

現在、以下の環境を使っています。
-------------------------------
OS:Windows XP
MATLABのバージョン:R2007a
-------------------------------

以下の内容をプログラムでどう組み込めばよいのか分らないため、質問させて頂きました。
詳しい方、ご教授のほどお願いします。

(1)Windowsのペイントで、ドラッグ&ドロップすると
   +----------+
   |         |
   +----------+
 このように、点線で枠ができると思います。それをMATLABで表現する方...続きを読む

Aベストアンサー

だいぶ日にちが経っているので解決したor手遅れかも知れませんが。

わかるところだけで勘弁して下さい。
MATLAB-GUIとはMatlab figureなどのことと思っていいのでしょうか?
そうでなかったらその時点で私にはお手上げですね…
(2)
tifに限らず、大体の画像データはimreadで取り込めます。
出力変数が可変なのでいろいろありますが、大体は
画像データ(縦×横)とカラーマップデータ(64×1のベクトルだったかな?)
あるいは
画像データ(縦×横×3(RGBそれぞれのデータが層になっている))
だったと思います。
ただimreadはいろいろオプションで設定しないといけないみたいで、
私自身ちゃんとは使えていません…pngとjpgとbmpぐらいしか表示させたことないです。
画像を表示させるには基本的にはimageでいけます。

(3)
これは「どのようなモニターで見ても」ということでしょうか?
Ssize=get(0,'screensize');
でSsizeにはモニターのサイズ(1×4 double)が入ります。
[左端の位置、下端の位置、幅、高さ]です。ただget(0)で得られるサイズなので、特に何もいじっていなければ(get(0,'Unit')=='pixel'であれば)
最初の2つの成分は1になるはずです。
例えばSsize=[1,1,1024,768]であればそのモニターのサイズは
1024ピクセル×768ピクセルということです。
ということはモニターの中央はSsize(3)/2,Ssize(4)/2で得ることができます。
次にMatlab-GUIですが、位置や大きさを決めるプロパティは'Position'です。
figureならget(gcf)で見ることができます。
このpositionというプロパティもSsizeと同じ形で格納されています。
>MATLAB-GUIを表示した時に、表示位置を常にパソコンのモニター中央にする方法
ということですので、figureの中心位置とモニターの中心位置を一致するように
positionプロパティをいじればいいです。
と文章で書いても自分でもよくわからないことになったので簡単にスクリプトを書いてみます。
figure;
Fsize=get(gcf,'Position');
Ssize=get(0,'ScreenSize');
set(gcf,'Position',[Ssize([3 4])/2-Fsize([3 4])/2,Fsize([3 4]));
これでどんなモニター上でもfigureは画面の中央に来ると思います。
これに限らず、MATLABでいじれるさまざまはハンドルを取得し、get(ハンドル)とすることで
どのようなプロパティが設定されているのか見ることができます。

(4)
とりあえずボタンを作って、そのボタンを押した時に走る関数を書き込んでやればいいです。
Aの画像を表す行列をA,Bの画像を現す行列をBとします。
figure;
h_i=image(A);
h_ui=uicontrol;
set(h_ui,'type','button');%すでにボタンになっていたら不要
set(h_ui,'callback','set(h_i,''Cdata'',B);');

h_uiのcallbackプロパティに先ほど描いた
figureのCdataプロパティをBに変更するというコードが
動くようにしました。
これで所望のことはできると思うのですが…

「こういうことがしたいんじゃないんだ」などありましたら補足に願います。
長文失礼しました。参考になれば幸いです。

だいぶ日にちが経っているので解決したor手遅れかも知れませんが。

わかるところだけで勘弁して下さい。
MATLAB-GUIとはMatlab figureなどのことと思っていいのでしょうか?
そうでなかったらその時点で私にはお手上げですね…
(2)
tifに限らず、大体の画像データはimreadで取り込めます。
出力変数が可変なのでいろいろありますが、大体は
画像データ(縦×横)とカラーマップデータ(64×1のベクトルだったかな?)
あるいは
画像データ(縦×横×3(RGBそれぞれのデータが層になっている))
だったと思います。
ただimread...続きを読む

QMATLABのプログラミングについて

マウスのカーソルの移動距離を計測したいのですが、
MATLABでできますでしょうか。

プログラムでどう組み込めばよいのか分らないため質問させて頂きました。
MATLAB初心者のため、詳しい方ご教授のほどお願いします。

左クリック(開始)→マウスを動かす→左クリック(終了)
のようにクリックからクリックまでの移動距離を計測したいのです。
できれば、マウスカーソルの軌跡も表示させたいです...。
丸投げで聞いてしまい申し訳ないのですが、
緊急で必要になったため、質問させていただきました。

以下の環境を使っています。
 -Windows 7
 -R2010b

Aベストアンサー

三度Kulesです。
ん~仕様が簡単に変わってしまうてのもなかなか不信感なんですけどね。
そもそも
左クリック(開始)→マウスを動かす→左クリック(終了)

クリック→ドラッグ→ドロップ
だとだいぶ操作感が違うと思うんですが…
最初の仕様の指定はどこから来たものなんですかね?
まあとりあえずそれぞれの処理を書きますね。

とりあえず共通で使われる変数名を決めときます。
ax…軸のハンドル
f…Figureのハンドル
flg_Click…クリック中かを表すフラグ
pos…カーソルの軌跡を格納する
distanse…カーソルの移動距離を格納する
tmp…最終的には必要ない変数。tmp1,tmp2などのように使う。

1)クリック時
function Click
%軸の中にimageがあり、なおかつ軸の中にポインタがあり、
さらにflg_Clickがfalseの時だけ実行し、
%それ以外の時はそのままreturnする
tmp1=get(ax,'Children');
if ~any(strcmpi(get(tmp1,'Type'),'image');return;end;
tmp1=get(ax,'CurrentPoint');
tmp2=get(ax,'Xlim');
tmp3=get(ax,'Ylim');
if tmp1(1,1)<tmp2(1)||tmp(1,1)>tmp2(2)||tmp1(1,2)<tmp3(1)||tmp1(1,2)>tmp3(2);return;end;
if flg_Click;return;end;
flg_Click=true;
pos=tmp1(1,1:2);
distanse=0;

2)ドラッグ時
function Drag
% flg_ClickがtrueでカーソルがAxes内にある時のみ処理をする
if ~flg_Click;return;end;
tmp1=get(ax,'CurrentPoint');
tmp2=get(ax,'Xlim');
tmp3=get(ax,'Ylim');
if tmp1(1,1)<tmp2(1)||tmp(1,1)>tmp2(2)||tmp1(1,2)<tmp3(1)||tmp1(1,2)>tmp3(2);return;end;
tmp2=pos(end,:);
tmp3=sqrt(sum((tmp1(1,1:2)-tmp2).^2));
pos=[pos;tmp1(1,1:2)];
distance=distance+tmp3;

3)ドロップ
function Drop
% flg_ClickがtrueでカーソルがAxes内にある時のみ処理をする
if ~flg_Click;return;end;
tmp1=get(ax,'CurrentPoint');
tmp2=get(ax,'Xlim');
tmp3=get(ax,'Ylim');
if tmp1(1,1)<tmp2(1)||tmp(1,1)>tmp2(2)||tmp1(1,2)<tmp3(1)||tmp1(1,2)>tmp3(2);return;end;
flg_Click=false;
set(ax,'NextPlot','Add');
plot(ax,pos(:,1),pos(:,2));
set(ax,'NextPlot','Replace');
fprintf('移動距離:%f\n',distanse);

おまけ:それぞれの関数が思ったタイミングで動作するよう設定
set(f,'WindowButtonDownFcn',Click);
set(f,'WindowButtonMotionFcn',Drag);
set(f,'WindowButtonUpFcn',Drop);


以上です。関数名、変数名のスペルが怪しいのはご愛嬌ということで。
いくつか注意点を。
1.実際に実行してみるとわかると思いますが、このままでは全く動きません。
多分「axは未定義の関数です」とか何とかいうエラーが出ると思います。
…まあデータのやり取りについてはあなたの書いた処理には書かれていませんでしたしね。
私も「処理の一部」としてわざと書かなかったわけですし。
いじわるを言うようですが、一連の処理を書く時は
・データを読みだす
・処理をする
・データを書きこむ
が必要です(もちろん必要がない時もあります)
どのようにデータ(軸のハンドルや軌跡の座標など)を読み出し、保存するかを決めなければこの関数達は完成しません。

2.私の作ったものとはかなり違う形になっています。
データをどのようにやりとりするかも含めて1つの関数で全て解決するようにしたため、構成はかなり違うことになっています(構造が複雑になるので読みにくくなってます)

3.例外的な操作をした時想定外の動作をします(下手するとエラーが出ます)。
Axes内でクリック→Axes外までドラッグ→その場でボタンを離す→再びAxes内にカーソルを戻してクリック→Axes内でドラッグ→Axes内でボタンを離す
とすると、軌跡は1回目のクリック以降のものからのトータルが示され、距離も最初のクリックからの合計になります。
これは多分望んだ動作ではないですよね?これを回避するためどのようにしますか?
また、
Axes内でクリック→Axes外までドラッグ→再びAxes内に戻してからボタンを離す
とすると、Axes外に出た点から戻ってきた点が線で結ばれますし、その距離も移動距離に加えられます。
これも多分望んだ動作ではないですよね?これを回避するためどのようにしますか?

失礼を承知できついことを書きますが、
3.が想定できていない時点でまだ仕様すらきちんと固まってないな、と思います。
仕様は基本的に課題などでは人から与えられるものですが、仕様がさらっと変わるところをみるとそういうわけではないんですよね?
だとしたら、通常の動作以外にどのようなことが起こるのかを想定して、その時はどのような動作をさせるのかを考える必要があります。
前も書きましたが、仕様→処理を決めるのに必要なのは言語に対する知識ではなく、想像力(自分が考えている通りの動作以外の操作をした時、どのようなことが起こりうるかを考える力)です。
想像を働かせる→それを達成するためにどのような処理を加えるか考える→所望の処理をさせるためにどのようなコードを書けばよいか勉強する
という流れでプログラムのスキルは上がっていくものだと思います(人から与えられた必要性ではなく、自分の内から出た必要性の方が、勉強する気も起りますよね)

参考になれば幸いです。

三度Kulesです。
ん~仕様が簡単に変わってしまうてのもなかなか不信感なんですけどね。
そもそも
左クリック(開始)→マウスを動かす→左クリック(終了)

クリック→ドラッグ→ドロップ
だとだいぶ操作感が違うと思うんですが…
最初の仕様の指定はどこから来たものなんですかね?
まあとりあえずそれぞれの処理を書きますね。

とりあえず共通で使われる変数名を決めときます。
ax…軸のハンドル
f…Figureのハンドル
flg_Click…クリック中かを表すフラグ
pos…カーソルの軌跡を格納する
distanse…カーソルの移動距...続きを読む

QMATLABプログラミングについて

卒業研究のデータ解析をMATLABで行っているのですが,
途中で行き詰ったためお助けをお願いします.

質問内容は,実験により得られたデータがほぼsin波なのですが,その波の数をプログラムで読み取るためにはどうすればよろしいのでしょうか?実験データなので細かく見ると上下に振れています.
データをプロットしたグラフだと間隔の狭いところは読みにくく困っています.また,始点と終点の読み取り方法もわかりません.
どのようなプログラムを組めばいいか教えてください.

質問がわかりにくいと思いますがよろしくお願いします.

Aベストアンサー

波のピークを全て回数としてカウントするのであれば、

(1) HPFをかける
(2) Diffをとる
(3) (2)の結果で、-から+に切り替わる位置(凸ピーク位置)と回数を取得する
(4) (2)の結果で、+から-に切り替わる位置(凹ピーク位置)と回数を取得する
(5) (3)と(4)の内、少ない方がsin波の波の数

で無理でしょうか。

始点と終点については、(3)の先頭<(4)の先頭であれば(3)-(4)間、(3)の先頭>(4)の先頭であれば(4)-(3)間の各ピーク位置間の(1)の波形に対して、3次関数のフィッティングをかけて、適切な根を選択すれば可能なような気がします。

QMATLABのプログラミング

MATLAB全くの初心者です。

横軸を時間、縦軸を反応値は0または1に固定したもので、
周期性をもったパルス波形を生成したいのですが、
途中でつまずいてしまいました。
グラフをプロットすると、
____∧__∧___
このようなグラフになってしまいます。
本当は、
__|____|____
このようなグラフをつくりたいと考えているのですが…

関数zerosを使った記述方法があれば教えていただきたいです。
よろしくお願いいたします。

Aベストアンサー

matlab の plot は,滑らかに繋ぐようにできているので,
パルス列か折線になるのは,仕様です.
「線を表示しないようにする」のが一番簡単な解決法です.

X = zeros(1,10);
X(5) = 1;
figure
plot(X);
figure
plot(X,'d'); %%% こんな感じで 線を引かないようにする.

plot のヘルプでも見てみよう.
doc plot


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報