トップページ⇒tech
990コメント352KB

MATLABプログラミング 質問箱 その3

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2009/10/03(土) 09:01:48
MATLAB 日本語版
http://www.cybernet.co.jp/matlab/
MATLAB 本家
http://www.mathworks.com/

Yahoo MATLAB
http://dir.yahoo.co.jp/Science/Mathematics/Software/MATLAB/
MATLAB入門
http://feedback.mech.fukui-u.ac.jp/matlab/matlab0.htm
MATLAB チュートリアル
http://www-isys.eei.metro-u.ac.jp/~sho/pub/ttmatlab/Index.html


前スレ
MATLABプログラミング 質問箱 その2
http://pc11.2ch.net/test/read.cgi/tech/1163125702/
0412デフォルトの名無しさん2011/08/19(金) 09:26:33.93
>>411
マッチョラブ
0413デフォルトの名無しさん2011/08/19(金) 11:33:40.59
>>411
MathWorks日本語版公式サイトだと
ttp://www.mathworks.co.jp/products/matlab/

「MATLAB (マトラボ / マットラブ) 」と併記してるのでこの両方が公式
ただし「ソースを表示」等でHTMLファイルを見ないと書いてない
0414デフォルトの名無しさん2011/08/19(金) 14:44:57.39
マットラボって読んでたんだが、間違いなのか・・・
0415デフォルトの名無しさん2011/08/19(金) 19:02:38.63
MATLAB Version 7.12 (R2011a)
Statistics Toolbox Version 7.5 (R2011a)

なのですが、Statistics Toolboxの主成分分析のサンプル(ttp://www.mathworks.co.jp/help/ja_JP/toolbox/stats/princomp.html)
してみたら、分散行列の1列、4列だけ符号逆で出てくる。

>> load hald
>> [pc,score,latent,tsqure]=princomp(ingredients)

pc =

-0.0678 -0.6460 0.5673 0.5062
-0.6785 -0.0200 -0.5440 0.4933
0.0290 0.7553 0.4036 0.5156
0.7309 -0.1085 -0.4684 0.4844


プログラミングの質問じゃない気がするけど、分かる方いたら宜しくお願いします。
サポートに連絡した方がいいのかな?
0416デフォルトの名無しさん2011/08/20(土) 00:02:53.50
R2011評価版を入手。30日間の期限が切れた。
時計を戻した。使えるじゃん・・・。
0417デフォルトの名無しさん2011/08/20(土) 00:44:25.84
お巡りさん、こっちです
0418デフォルトの名無しさん2011/08/20(土) 17:43:32.17
>>415
PCA で出せる loading と score の符号は arbitrary なので問題ない。
各アプリケーション間でバラバラな上に、
同一のアプリケーションの違ったバージョンでもバラバラだったりする。

0419デフォルトの名無しさん2011/08/20(土) 21:19:39.91
>417
ハックしてるわけじゃないから、問題ないのでは。
0420デフォルトの名無しさん2011/08/21(日) 07:32:47.00
タイムパトロールに通報しといた
0421デフォルトの名無しさん2011/08/21(日) 19:05:58.91
>>419
多分民事ですね。マジメにお金払ってる人が騒ぎたくなる気もわかりますが。

それにしてもmatlab高いよ。本体とほんの数種類のtoolboxで150万円なんて。
これと比較したらあのAdobe CS 5.5ですら安くみえます。
0422デフォルトの名無しさん2011/08/21(日) 20:26:32.62
そんなこと言うならOctave使えばいいじゃん。
0423デフォルトの名無しさん2011/08/22(月) 00:05:09.44
残念ながらオクターブじゃ仕事にならないんだよ…。matlabのような統合開発環境が必要。
0424デフォルトの名無しさん2011/08/22(月) 09:12:01.37
Scilabとかもあるな
仕事なら経費と思うしかない
金が無いなら数式見てゴリゴリ書け
0425デフォルトの名無しさん2011/08/22(月) 17:34:19.31
FreeMatでいいじゃん
0426デフォルトの名無しさん2011/08/22(月) 19:41:04.44
>>424
>>425
ま、経費なんで痛くも痒くもないんですが、20万超えると承認もらうのが面倒。

matlabのいいところって、グラフをGUIで直感的にガンガン加工したのちに、.mファイルに変換して、次からは自動で描画させる事ができることろだと思うんです。もしmatlabからその機能がなくなったらOctaveに移行します。
0427デフォルトの名無しさん2011/08/22(月) 21:20:22.64
>>418

ありがとうございました。
んんー、なるほどー。
0428デフォルトの名無しさん2011/08/24(水) 14:30:24.72
クラス定義の中でプロパティの値を書き換えるとき
下のように書くと警告が出る上、xが空のままになるのですが
どのように書けばよいでしょうか?

classdef Class
  properties
    x
  end
  methods
    function this=Class()
      this.init();   % this.x=2 を代入する
      this.x     % ans = [ ] と表示される
    end
    function init(this)
      this.x=2;
    end
  end
end

0429デフォルトの名無しさん2011/08/24(水) 18:53:42.80
自己解決しました。
参照渡しとなるように以下のような書き換えが必要だったようです。

classdef Class
  properties
    x
  end
  methods
    function this=Class()
      this = this.init();     % 変更
      this.x
    end
    function this = init(this)  % 変更
      this.x=2;
    end
  end
end
0430デフォルトの名無しさん2011/08/31(水) 07:05:05.01
i行i列のu(i,j)という2次元配列を作って、それぞれに値を格納したんですが、
(iは1〜100、jは1〜100)

このu(i,j)という配列を3次元でグラフ化したいのですが、上手くいきません。

・surf(u);
・waterfall(u);
・
surf(u(1,:));

hold on
for i=2:1:100
surf(u(i,:));
end
hold off

いずれも上手くいきません。。
分かる方、教えて頂けたら助かります。
0431デフォルトの名無しさん2011/08/31(水) 11:29:14.51
>>430
surf(1:100, 1:100, u);

1:100のところは自分の好きなように変えるべし。
0:99でもいいし、linspace(-pi, +pi, 100)とかでもいい。
0432デフォルトの名無しさん2011/08/31(水) 15:44:01.31
ありがとうございます。
試してみたのですが、上手くいきませんでした。。ソースは以下の通りです。
1次元の熱伝導方程式について、以下のように差分法を用いて、時間変化に伴う温度分布をグラフ化しようとしました。

u=[];
t0=0; te=0.1; dt=0.01;
nx=9; x0=0; xe=1.0; dx=1.0/nx;

x=x0:1.0/(nx-1):xe;
u=sin(pi*x);

for i=2:1:te/dt
for j=1:1:nx
u(i,j)=1;
end
end
for i=2:1:te/dt
u(i,1)=0; u(i,nx)=0;
for j=2:1:nx-1
u(i,j)=u(i-1,j)+((dt)/(dx)^2)*(u(i-1,j+1)-2*u(i-1,j)+u(i-1,j-1));
end
end
plot(x,u);

時間変化による温度分布を見やすくするためにx軸をx(0〜1.0)、y軸をt(0〜0.1)、z軸をuの値として、3次元のグラフにしたいのですが、2次元のグラフでしか表現できません。。
どなたか分かる方、教えて頂けたらうれしいです。
0433デフォルトの名無しさん2011/08/31(水) 21:39:56.88
「surf使うときはmeshgrid」を呪文のように唱えてる。仕組みは知らん。

まず
for i=2:1:te/dt
ってとこだけど、0秒をi=1にしてるわけだから
for i=2:1:te/dt+1
にしないと合わない。
で、あとは plot(x, u) の部分を下で置き換えたらできるはず。

t = t0:dt:te;
[X,T] = meshgrid(x,t);
surf(X,T,u);


まぁそのコードに関しては色々言いたいことあるんだけどね。
最初のforブロックはones使えよとか
i=a:1:b は i=a:b でいいじゃないかとか
スペースとかインデントとか
0434デフォルトの名無しさん2011/09/01(木) 10:46:31.94
>>433
ありがとうございます。とても助かりました。
指摘も参考になりました。

数学的な質問になるかもしれないのですが・・・
432のu=sin(pi*x);の部分を
u=sin(pi*x)+sqrt(-1)*cos(pi*x); ←これは自分が適当につくりました
と、虚数を含む式として走らせてみたところ、
---------------------------------
??? Error using ==> surf at 78
X, Y, Z, and C cannot be complex.

Error in ==> question at 28
surf(X,T,u);
---------------------------------
というエラーが出てしまいました。
初期条件のuや、
for文の中のu(i,j)の式に、例えば
u(i,j)=(1/sqrt(-1)) * (u(i-1,j)+((dt)/(dx)^2)*(u(i-1,j+1)-2*u(i-1,j)+u(i-1,j-1)));
のように虚数が含まれる場合はどのような手順で解を導けば良いのでしょうか?
課題や研究ではなく、単純に疑問に思いました・・・


0435デフォルトの名無しさん2011/09/01(木) 14:00:42.44
>>434
複素数ってのは描画するとしたら複素平面上にしかできないわけで、
xとtを軸とした3次元プロットは手書きしようとしてもできないでしょ。

自分は振動の分野の人間だから
複素数は時間領域の場合実部をとる。(結局u=sin(pi*x)になる。)
ちょっと問題設定がわからないからこれ以上はなんとも言えないな。

ちなみにsqrt(-1)はMatlabの場合1iで書けるよ。
u=sin(pi*x)+1i*cos(pi*x);
0436デフォルトの名無しさん2011/09/02(金) 09:39:06.37
>>435
ありがとうございます。
複素数を実部と虚部に分けて考えるべきでしょうか。
例えば
u(t,x)=sin(pi*x)+1i*cos(pi*x)=a(t,x)+1i*b(t,x)
として、
a(t,x)とb(t,x)の時間変化に伴う値の変化を調べるのがいいのかなと。
u(t,x)の初期条件や境界条件からa(t,x)とb(t,x)のそれぞれの条件も出てくると思いますし。


0437デフォルトの名無しさん2011/09/02(金) 11:14:58.46
>>436
まぁ少なくとも線形な方程式なら問題なくそれで解けるよね。
ただ複素数にして何を知りたいのかがよくわからないから
何とも言えないところではある。
0438デフォルトの名無しさん2011/09/03(土) 19:27:45.28
>>437
線形でない場合は違うのでしょうか??・・・^^;
線形でない場合って・・・例えばどんな場合でしょうか・・・?
無知ですみません。。
0439デフォルトの名無しさん2011/09/04(日) 11:10:03.66
>>438
単純な例として
線形:  y = 2*x
非線形: y = x*x
の場合、x = a + ib を代入したときに
非線形の場合成立しないでしょ。
正しくは
 y = a^2 - b^2 + 2i*a*b
なのに、実部と虚部別に計算すると
 y = a^2 + i*b^2
になる。

※非線形というのは1次式または0次式(線形)でない、という意味ね。念のため
0440デフォルトの名無しさん2011/09/04(日) 12:40:33.68
教えていただきありがとうございます。勉強になります・・・
この機会なので、もう少し教えてください・・
例えば

i*(δu/δt)+i*(δu/δx)+u^2=0・・・(1)
っていう非線形の偏微分方程式があったとき、

u=u(t,x)、0≦x≦1、0≦t≦10
境界条件は (δu/δx)(t,0)=(δu/δx)(t,1)=0
初期条件は、u(0,x)=sin(πx)+i*x*cos(πx)
とした場合、
0441デフォルトの名無しさん2011/09/04(日) 12:41:13.47
上の続き・・・


安易ですが、自分の解法の流れとしては・・・
まずはu=u(t,x)=a+ib=a(t,x)+i*b(t,x)、 (a,bは実数)として,
(1)に代入して実部と虚部を分ける?
↓
-δb/δt - δb/δx + a^2 - b^2 = 0 ・・・(2)
δa/δt + δa/δx +2ab = 0・・・(3)

次にu(t,x)の境界条件や初期条件から、
a(t,x),b(t,x)のそれぞれの境界条件や初期条件を求める・・・
↓
そして、(2)、(3)を解く・・・
(ここまでは合っていますでしょうか?^^;)


線形項については、時間変化に伴うa(t,x)とb(t,x)についての値の変化を見る・・・
非線形項のu^2については、u^2=(a+i*b)^2=a^2-b^2+2ibの、
実部(a^2-b^2)、虚部2bについて、それぞれ変化を見る・・・

何を知りたいのかは別にして、解析の流れとして
このように考えたのですが、おかしいでしょうか・・・?



0442デフォルトの名無しさん2011/09/06(火) 23:10:27.46
すみません、取り込み中のところすみませんが、
matlabでコードを作って計算させるときに、
計算時間がえらく長くかかることあるじゃないですか?
で、何十分もかけた割にはあんまり有益なデータが取れなかったりして・・・

実際にmatlabを走らせる前に、だいたいの計算時間みたいなのを知ることって出来ないんしょうか?
厳密でなくても、だいたいでも結構です。

やり方などわかる方、教えてください。

0443デフォルトの名無しさん2011/09/07(水) 07:31:34.26
profile
tic toc
でループの中とか時間のかかりそうな部分を計測して
ループの回数をかけるとか
0444デフォルトの名無しさん2011/09/07(水) 15:52:49.54
matlab使う前に基本的なプログラミングからやり直したほうがいいと思う。
マクロ・スクリプトとして便利だけどライブラリ任せになるとツール頼みになりますよ。
matlabやoctaveてインタプリタだからプログラミングしても遅いと思うけど。

インタプリタだと、極端な話、例えばN88BASIC互換のインタプリタ言語をPentium4-3Ghzで動作させたものと
25MhzのSH2-7125のC/C++コンパイラでベンチとれば、SH2にあっさり負けますよ。
場合によっては1/10以上の差がありますから数値計算でプログラミングできない人は致命的ですよ。
ちょっとした電卓代わりなら良いですが、便利だからとクラスタでインタプリタ動かそうとしてる人はリソースの無駄遣いで、
そんなもの幾ら高速のンピュータでもリソースは足りませんよ。
0445デフォルトの名無しさん2011/09/07(水) 16:41:16.93
>>444 は、いまどき珍しい原理主義者だなぁ。
例に挙げてるのもホントに極端なものだし。
「インタプリタだから何でもかんでも遅い」っていうのは、
頭が固くて、なおかつ自分でベンチとってないお年寄りの念仏でしかないよ。
Matlab は、コードの可読性と処理速度のバランス面で、たいへん優れている。

Matlab で致命的に遅いのはグラフィックスまわり。描画の方。レンダリング重すぎ。
0446デフォルトの名無しさん2011/09/07(水) 18:01:15.48
質問よろしいでしょうか?
mex -setup のコマンドを用いてコンパイラの設定を行おうとしたところ,
カスペルスキーから警告されました.そして,操作を許可したのですが,その
直後にMatlabが落ち,起動しなくなってしまいました.
mex -setup のコマンドが正しく実行されない理由についてお教え下さい.
宜しくお願いいたします.
0447デフォルトの名無しさん2011/09/08(木) 02:15:46.63
C/C++でライブラリに頼らず書けってのか。
プログラミング初心者にそんなこと言ってたら
主眼の研究に取り掛かるのが
いつになることやら。

デバッガ、lint、プロファイラ、お手軽グラフィックが完備した
マトラボでさっさと研究を進めるべき。

マトラボでプログラミングに慣れて来たら、
Cなりアセンブリ言語なりCPUアーキテクチャなり
勉強すればよい。
0448デフォルトの名無しさん2011/09/08(木) 09:17:49.09
MATLABを使用する理由って、プログラムがよくわからなくても高度な計算がしたいってのが主な理由だしなぁ
学者や研究者がプログラミングも出来るにこしたことは無いけど、プログラマを目指す訳じゃないんだし、後回しで良いと思うけどね
つーかプログラミング出来るなら、自分でゴリゴリ数式書いたほうが良いし

>>446
カスペルスキーからどんな警告が出たのかくらい書け
とりあえず、カスペルスキーを外してから再度実行してみろ
0449デフォルトの名無しさん2011/09/08(木) 11:32:55.02
http://odin.fi-b.unam.mx/software/matlab/windows/Matlab%20R13%206.5%20Full%20+%20Serial%20+%20Manual/Documentation%20CD/jhelp/techdoc/math_anal/ch_8_23b.html
を参考にしながら、

δa/δt=-δa/δx-b(c^2+d^2+a^2+b^2);
δb/δt=-δb/δx+a(c^2+d^2+a^2+b^2);
δc/δt=δc/δx-d(a^2+b^2+c^2+d^2);
δd/δt=δd/δx+c(a^2+b^2+c^2+d^2);
(初期条件を適当にセットし、境界条件はノイマン条件としました)
という方程式を解こうとおもい、以下のようにコードを作ってみましたが、走らせると

??? Error using ==> solver5>pdex4pde
Too many input arguments.

Error in ==> pdepe at 259
c = feval(pde,xi(1),t(1),U,Ux,varargin{:});

Error in ==> solver5 at 7
sol=pdepe(m,@pdex4pde,@pdex4ic,@pdex4bc,x,t);
このようなエラーが出てしまいます・・・
どなたか、改良していただけると助かります・・

以下が作ったコードです・・
0450デフォルトの名無しさん2011/09/08(木) 11:35:04.74
function solver5
m=0;
x=0:0.1:10;
t=0:1:1000;
sol=pdepe(m,@pdex4pde,@pdex4ic,@pdex4bc,x,t);
u1=sol(:,:,:,:,1);

function [c,f,s] = pdex4pde(x,t,u)
c=[1;1;1;1];
f=[-1;-1;1;1] .*u;
a= -u(2)*( u(3)*u(3)+u(4)*u(4)+(1/2)*( (u(1)*u(1)+u(2)*u(2)) ) );
b= u(1)*( u(3)*u(3)+u(4)*u(4)+(1/2)*( (u(1)*u(1)+u(2)*u(2)) ) );
c= -u(4)*( u(1)*u(1)+u(2)*u(2)+(1/2)*( (u(3)*u(3)+u(4)*u(4)) ) );
d= u(3)*( u(1)*u(1)+u(2)*u(2)+(1/2)*( (u(3)*u(3)+u(4)*u(4)) ) );
s=[a;b;c;d];

function u0=pdex4ic(x)
if 4 <= x && x < 6
u0=[0.8;-0.2;-0.8;0.2];
elseif 6 < x && x <= 8
u0=[0.8;0.2;-0.8;0.2];
else
u0=[0.8;0;-0.8;0];
end


function [pl,ql,pr,qr] = pdex4bc(xl,ul,xr,ur,t)
pl = [0;0;0;0];
ql = [1;1;1;1];
pr = [0;0;0;0];
qr = [1;1;1;1];
0451デフォルトの名無しさん2011/09/10(土) 08:27:08.60
初歩的な質問で申し訳ないんですが
surfグラフをhold onして2つの面グラフの色を塗り分けたいと思ってます。

colormap([1 0 0])っていうふうにセットしてるんですが
2つ目のグラフの色で両方のグラフが染まってしまいます。
どうにかなりませんか?
0452デフォルトの名無しさん2011/09/14(水) 01:32:47.55
parallel computing toolboxを使って分散処理を考えています。
forループをparforにして分散処理をさせる方法をとっています。
このとき例えば、

parfor n=1:5
tmp(n) = n;
end
ans = sum(tmp)/n

のようにparforループ内でparforループ変数ごとに求めた値をparfor外でまとめて計算したいのですが、
「テンポラリ変数tmpはparforループの後に使われますが、その値は確定性がありません」
とエラーが出て、プログラムを実行できません。
何か良い案はないでしょうか。
0453デフォルトの名無しさん2011/09/14(水) 13:09:09.00
ないあるよ
0454デフォルトの名無しさん2011/09/14(水) 14:07:14.98
ありますん
04554522011/09/14(水) 21:54:54.81
>>453-454
ありがとうございます。
おかげさまで解決しました。
0456デフォルトの名無しさん2011/09/16(金) 03:25:44.17
以下のコードで、
フィルタをとおさない場合、信号とそれ以外のスペクトルは25dBあるのですが、
フィルタをとおすと、信号以外のスペクトルが盛り上がってきてしまいます。
遮断領域がフィルタの影響で落ちて、通過帯域はそのままであって欲しいのですが、
どういった理屈でこうなってしまうのでしょうか?

data_len = 120000;
data=0.5*sin(2*pi*1/30*(0:data_len-1));%1MHzの信号。30MHzサンプリング。
b=fir1(33,0.4);
data=filter(b, 1, data);
plot(log10(abs(fft(data)).^2));
0457デフォルトの名無しさん2011/09/19(月) 21:40:16.71
それはMatlabのせいじゃなくて、フィルタってそんなもん。
0458デフォルトの名無しさん2011/09/20(火) 10:30:56.56
計算した結果を変数エディタやグラフにすると10^-4よりも小さい値は0になるのがデフォですか?
0459デフォルトの名無しさん2011/09/21(水) 11:56:36.78
matlabで行列名に番号等を付けて、ループを使って自動的に回したり作成したいんですが、
どうしたら良いですか?

たとえばA1,A2,A3…A100などと100個の行列を作成したい場合、
行列の名前に数字等を付けて、

for i=1:100
A[i]={6,6,6}←ここの値、式はなんでも良いのですが・・・
end

とかにして、意図した数の行列を作成したりするなど、行列の名前につけた数字に対して
iなどの変数を用いたりすることは可能でしょうか?
またどういう表記にすれば良いのでしょうか?
初心者の質問ですみません。
0460デフォルトの名無しさん2011/09/21(水) 14:02:49.58
もし本当に 100 個の変数が必要なら、以下のように eval を使い、
「文字列の内容そのものを評価する」方法で、それを実現できます。

for i = 1:100
str = sprintf('A%d = [6 6 6];', i);
eval(str);
end

でも、別に 100 個の変数が必要ないのなら

for i = 1:100
A(i, :) = [6 6 6];
end

とか

for i = 1:100
A{i, :} = [6 6 6];
end

というふうに 1 個の変数あるいはセルなどに収めた方がスマート。
0461デフォルトの名無しさん2011/09/22(木) 16:25:54.53
初歩的な質問ですいません。
連結リストをつくるときなど、Cだとポインタを使うようなケースを、
Matlabではどんな感じで書くのでしょうか?
0462デフォルトの名無しさん2011/09/22(木) 17:21:51.88
libpointer が使える環境なら、
それ使って C での実装をトレースすればよい。

でも原理的に連結リストを実現するために必要な情報さえ把握できていれば、
libpointer を使わずに自分で組む方法も自然と頭に浮かぶと思うけど。
04634612011/09/22(木) 17:58:37.61
>>462
レス有難うございます。
当方Cをほんの少し知っている程度の人間なのですが、
今後Matlabも少々扱わなければならなくなり
Matlabの入門書を読んでいて疑問に思った次第です。

libpointerを使わない場合は、
構造体のアレイや、クラスを使うのでしょうか?
0464デフォルトの名無しさん2011/09/22(木) 18:08:00.55
>>463
そういう認識で良いと思います。
Matlab みたいに配列や行列の可視化が容易な環境の場合は、
変に C でのポインタの概念に縛られない方がよいかと。
04654592011/09/22(木) 18:24:56.20
>>460
どうもありがとうございました。
出来ました。
0466デフォルトの名無しさん2011/09/22(木) 20:49:45.08
すみません、新しい質問なのですが、
画像を数十個出力して、連番になるように保存したいのですが、
どのようにすればよいのでしょうか?
いちいち出力したあとに一個一個saveしていくのは非常に面倒です・・・
また、画像を1つ1つ表示させず、保存のみしていく方法を教えて頂けたら尚嬉しいです。。
コードは以下のように作りまして、testの回数毎にe,f,g,hという関数をグラフとして出力しています
二つめの・・・の部分でe,f,g,hを計算しています。
どなたか分かる方、どの部分にどのようなコードを挿入すべきか教えて頂けると助かります。

0467デフォルトの名無しさん2011/09/22(木) 20:51:23.25
これが馬鹿には見えないコードってやつですか
0468デフォルトの名無しさん2011/09/22(木) 20:51:46.69
上の続き

for test=1:1:14

if test==1
epsilon = 0;
  ・・・
elseif test==13
epsilon = 0.013;
else
epsilon = 0.014;
end

・・・

0469デフォルトの名無しさん2011/09/22(木) 20:52:04.07
上の続き

figure;
waterfall(x,t,e);
zlim([-1 1]);
view([20,45]);
set(gca,'FontSize',18);

figure;
waterfall(x,t,f);
zlim([-1 1]);
view([20,45]);
set(gca,'FontSize',18);

figure;
waterfall(x,t,g);
zlim([-1 1]);
view([20,45]);
set(gca,'FontSize',18);

figure;
waterfall(x,t,h);
zlim([-1 1]);
view([20,45]);
set(gca,'FontSize',18);

end



04704632011/09/22(木) 21:50:16.27
>>464
発想を切り替えなくてはならないということですね。
アドバイス有難うございました!
0471デフォルトの名無しさん2011/09/22(木) 22:44:38.79
>>466
1. 連番のファイル名を作る ... >>460 参照
2. Figure を保存する関数 ... saveas
3. Figure を消す関数 ... close
というわけで、help コマンドでこれらの関数の使い方を覚えて試行錯誤すべし。
あと、Figure のハンドルの概念を help gcf を実行して学んでおくと後々便利。

Figure を表示しない(隠す)というのは
>> fh = figure;
>> set(fh, 'Visible', 'off');
みたいにして Visible プロパティを off にすれば実現できるけど、
>>466 のやりたいことを推測する限りでは本質ではない気がする。
0472デフォルトの名無しさん2011/09/22(木) 23:43:10.92
>>466
foldername=sprintf('test%f',test);
これをforのすぐ後ろに置いて

filename=sprintf('%s\\e_test%f.fig',foldername,test);
saveas(gcf,filename)
これをfigure毎に後ろに置くのはどうですか?
e_の部分をf,g,hにして各グラフ毎に。
0473デフォルトの名無しさん2011/09/23(金) 00:14:16.15
すいません、当方octaveしか無い貧乏学生なんですが

「filtfilt関数は、filter関数に比べて次数が倍になる」
みたいなのですが、それで合っていますか?
4次のバターワースフィルタを

[B,A]=butter(4,fc_Hz/(Fs/2));
y2=filter(B,A,y);
y3=filtfilt(B,A,y);

ってやると、y3はy2に比べて次数が倍(8次)になっている感じなんですが。
位相を合わせるために前からfilterかけて、さらに後ろからfilterかけるので
結局次数が倍になると理解していますが、合っていますでしょうか?
0474デフォルトの名無しさん2011/09/23(金) 00:40:11.09
Matlab の help を一部引用します。

FILTFILT Zero-phase forward and reverse digital filtering.
Y = FILTFILT(B, A, X) filters the data in vector X with the filter described
by vectors A and B to create the filtered data Y. The filter is described
by the difference equation:

というわけで、本来 filtfilt は複数のフィルタを合成する関数です。
決め打ちでフィルタの次数を倍にする訳ではなくて、その用途にも使える、ということ。
0475デフォルトの名無しさん2011/09/23(金) 08:58:57.39
>>474
すいません、
引数が

filter(B,A,y);

filtfilt(B,A,y);

なので、
>複数のフィルタを合成 
っていうのがよくわからないのですが。

聞きたい事は、

filter関数で出た結果と filffilt関数で出た結果は違う。
filtfilt関数の結果はfilter関数よりも次数が倍になっている

っていうのが合っているかどうかなんですが。
0476デフォルトの名無しさん2011/09/23(金) 15:09:08.62
新規の質問です、すみません。

for i=1:1:1000
for j=1:1:100
u(i,j) = a(i,j)^2 + b(i,j)^2 ;
v(i,j) = c(i,j)^2 + d(i,j)^2 ;
end
end

現在とあるコードの中に上記を含ませているのですが、計算に時間がかかってしまっています。。
2重ループではなく1回のループで計算させるやり方を考えているのですが、どうも上手くいきません。

効率の良いやり方分かる方、ご指摘ください。。お願いします。
0477デフォルトの名無しさん2011/09/23(金) 16:02:01.06
>>471さん
>>472さん

お返事ありがとうございます。
無事ファイルの保存が行えました。助かります。
保存先が現在デスクトップ上に勝手に保存されてしまうのですが、
特定の場所に保存したい場合はどうしたら良いのでしょうか?

0478デフォルトの名無しさん2011/09/23(金) 21:45:50.74
u=a.^2+b.^2
v=c.^2+d.^2
0479デフォルトの名無しさん2011/09/23(金) 21:52:50.49
やっぱり、MATLABの記法がすかん。

fortranやC++の方がまだまし。
0480デフォルトの名無しさん2011/09/23(金) 23:56:05.46
インデックスが1から始まるのが不思議。Fortranもだっけ?
不思議に感じるのはC脳だからだろうか?
0481デフォルトの名無しさん2011/09/24(土) 00:12:10.06
Matlabの、なんというかスプレッドシート型とでもいうか、
ループの替わりにアレイの演算にするのは風変わりで面白い
他より優れているとまでは言わんが。

他所に書いたものだけど、x^2+y^2==z^2を
満たす自然数の組(ピタゴラス数):
[x y z] = ndgrid(1:100);
sol = x.^2 + y.^2 == z.^2;
f = [x(sol) y(sol) z(sol)];
04824812011/09/24(土) 00:33:10.07
スプレッドシート型じゃなくてArray programmingと言うらしい
http://en.wikipedia.org/wiki/Array_programming
0483デフォルトの名無しさん2011/09/26(月) 16:58:48.49
matlabって乗算とかの時に*じゃなくて.*とかって書くときあるけど、なんで?
深い意味あんの?
0484デフォルトの名無しさん2011/09/26(月) 20:53:15.22
>>483
超大有り

* は行列の掛け算
.*は要素同士の掛け算

A=[1 ; 2]

A .* A = [1 ; 4]

A * A' =
[ 1 2
 2 4]

これを間違えると超ハマる。

0485デフォルトの名無しさん2011/09/28(水) 04:50:03.25
A^2は世界中で毎分、相当数のバグを生み出していると思われる
0486デフォルトの名無しさん2011/09/28(水) 15:09:16.59
おすすめの教科書を教えてください
0487デフォルトの名無しさん2011/09/30(金) 05:16:51.69
>>486
http://www.amazon.com/dp/0750687622/
かなり丁寧。プログラミング経験者ならくどいか

http://www.amazon.co.jp/dp/4798020419/
プログラミングは知っているという前提。
リファレンスとして使える
0488デフォルトの名無しさん2011/10/01(土) 01:08:11.04
saveasをつかって画像を保存しようとしたら
Need a handle to a Figure object
って出たんだけど、直し方知らないですか?
0489デフォルトの名無しさん2011/10/01(土) 10:18:58.14
>>488
もうちょい詳しく。
saveas( )
のカッコの中を書いてください
0490デフォルトの名無しさん2011/10/01(土) 22:49:07.80

function test

P = pi.*1/3;
x = linspace(-10,10,100);
dx = 0.01;
a = x.*sin(P);
e = a;
function e1=Fe(e)
e1= -(e(i,j+1)-e(i,j-1))/(2.*dx) ;
end

・・・

end


って感じのtest.mファイルを作って
(・・・の部分では最終的にeが100*100の行列になるまでいろいろ計算しています)
「Run File」でmatlabを走らせて、
waterfallでeをグラフ化しました。
しかし、eについて、WorkspaceやVariable Editorで配列の中身を確認できないんですけど、
確認できるようにするにはどうすればいいでしょうか?


0491デフォルトの名無しさん2011/10/01(土) 23:03:53.39
追加で質問なんですが、
配列に値を入れていくときに、linspaceとかを使うと計算時間の短縮に繋がると
思うんですが、その他に時間短縮でよく使えるものを教えてください。
あと、functionを使うと計算時間が遅くなったりすることはありませんよね?
0492デフォルトの名無しさん2011/10/01(土) 23:32:59.87
プロファイラが標準でついてるんだからまず試してみるべき
0493デフォルトの名無しさん2011/10/02(日) 18:50:42.53
R2011aの学生版を購入し、パス設定で下記のツールボックスを導入したのですが関数未定義となってしまいます
これはツールボックスが対応していないからなのでしょうか?
http://www.mathworks.com/matlabcentral/fileexchange/19
0494デフォルトの名無しさん2011/10/02(日) 19:05:53.04
自己解決しました
0495デフォルトの名無しさん2011/10/04(火) 14:59:59.55
z平面に極をプロットしたグラフを
円グラフみたいに扇形で色分けしたいんですが
どうやってやればいいのでしょうか?
0496デフォルトの名無しさん2011/10/04(火) 15:51:33.45
それは

借金をこさえてしまって貧乏なんですが
どうやって金持ちになればいいですか?

っていうくらい漠然とした質問だと思います。
せめて、何を試してどういう状態のグラフが手元にあるのか説明しましょう。
0497デフォルトの名無しさん2011/10/04(火) 16:07:45.88
>>495
失礼しました。
LPC係数をフィルタの伝達関数としたときのZ平面で極をプロットしたグラフです。
LPC係数はa0〜a10とし、
伝達関数H(z)=1/(a0+a1・z^-1+a2・z^-2+…+a10・z^-10)
です。

LPC係数a0〜a10はlpc_coefに格納、

kai=roots(lpc_coef)
zplane(1,kai)

としてz平面にプロットしました。
0498デフォルトの名無しさん2011/10/04(火) 16:40:00.02
>>497
zplane で出力したグラフを後から色分けしようとすると大変だと思うので、
kai の値を参照して、グラフ自体は pie で描画するというのはどうでしょう?
0499デフォルトの名無しさん2011/10/04(火) 16:47:48.29
>>498
レスありがとうございました、助かります。試してみます。
0500デフォルトの名無しさん2011/10/06(木) 15:13:16.29
>>498
pieのグラフとplotのグラフを重ねて表示させる方法を教えていただけないでしょうか;
0501デフォルトの名無しさん2011/10/06(木) 15:37:36.06
重ねて表示するだけなら hold on; を使えばよいです。

figure; hold on;
pie([2 4 3 5],{'North','South','East','West'});
x = -pi:pi/10:pi;
y = tan(sin(x)) - sin(tan(x));
plot(x,y,'--rs','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10);
0502デフォルトの名無しさん2011/10/06(木) 21:24:43.67
いつになったらeps保存が融通効くようになるのかね
0503デフォルトの名無しさん2011/10/07(金) 21:14:41.98
axesでクリックした座標に点を打ち、原点からその点までの線分と
x軸とのなす角をクリックする度に求めたいのですが、

function axes1_ButtonDownFcn(hObject, eventdata, handles)
Cp = get(hObject,'CurrentPoint');
xp = Cp(2,1) % X座標
yp = Cp(2,2) % Y座標
plot(xp,yp)
axis square

とすると、2回目のマウスクリック以降で座標が取得できなくなってしまいます。
plotを削除すると、繰り返して座標を取得ができます。
どうすればできますか?
05045002011/10/10(月) 04:24:08.71
>>501
ありがとうございます!
0505デフォルトの名無しさん2011/10/11(火) 13:44:14.67
学校のPCでマトラボプログラミングをしていたところ、
license manager error -15
というメッセージが出て、
以降起動できなくなりました。
原因と解決策を教えてください。
トラブルシューティング読んでも良くわかりませんでした
0506デフォルトの名無しさん2011/10/11(火) 15:40:43.36
>505
学校のPCの管理者に報告。
0507デフォルトの名無しさん2011/10/11(火) 21:30:17.06
>>505
神の啓示だと思って
octaveに乗り換える
0508デフォルトの名無しさん2011/10/12(水) 00:40:48.45
OctaveとかFreeMatは細かい所でMATLABと違うから困るよな
0509デフォルトの名無しさん2011/10/12(水) 05:00:42.59
matlabは年に2回とか訳の解らんペースで更新するからなぁ
しかも結構コロコロ関数が変わるし…

それはそうとどなたか>>503頼みます
0510デフォルトの名無しさん2011/10/12(水) 10:55:21.29
>>509
以下のコードで問題なく動いてる。
もし guide 使ってるなら、そっちの問題かもね。
あるいは、無理やり感があるけど axes1_ButtonDownFcn の最後に
set(hObject, 'ButtonDownFcn', @axes1_ButtonDownFcn);
の一行を加えとけばいいんじゃないかと。

-- test.m --

function test
figure; hold on;
set(gca, 'ButtonDownFcn', @axes1_ButtonDownFcn);

function axes1_ButtonDownFcn(hObject, eventdata, handles)
Cp = get(hObject,'CurrentPoint');
xp = Cp(2,1); % X座標
yp = Cp(2,2); % Y座標
plot(xp,yp);
axis square;
0511デフォルトの名無しさん2011/10/12(水) 19:41:39.86
>>510
どうもありがとうございます! test.mはきちんと動きました。
でもguideを使った自分のやつに持ってくるとやっぱりダメだった(´・ω・`)

guide使うのって良くないの? 
自分はmatlabのGUIは>>503の時点でguideのチュートリアル見ながら始めて3時間の初心者なので
こういうユーティリティに頼らないと簡単なものでもGUIは難しいです

> axes1_ButtonDownFcn の最後にset(hObject, 'ButtonDownFcn', @axes1_ButtonDownFcn);
はエラーが出てうまく動きませんでした。(これもtest.mではきちんと動作する)
@って関数ポインタみたいなもの? 自身の中で呼び出すという行為の意味もまだ理解できてません。

これは意外と難しいものに手を出してしまったかな;
■ このスレッドは過去ログ倉庫に格納されています