1 :デフォルトの名無しさん: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/


243 :デフォルトの名無しさん:2010/12/30(木) 11:04:50
はじめまして。matlab初心者です。

下のプログラムは、要素数の異なる2次元配列a,bのすべての要素同志の距離を計算して、
もっとも小さい距離をmindistに入れて、その配列番号をi,jに保存するプログラムです。

mindist = 1;

for i=1:length(a)
for j=1:length(b)

if mindist > sqrt((a(1,i)-b(1,j)).^2 + (a(2,i)-b(2,j)).^2)
mindist = sqrt((a(1,i)-b(1,j)).^2 + (a(2,i)-b(2,j)).^2);
ind_i = i;
ind_j = j;
end

end
end

これをfor文を使わない形にした方が、高速化できると聞いたのですが、
変形の方法が分かりません。どうか、ご教授下さい。何卒よろしくお願い致します。

374 :デフォルトの名無しさん:2011/07/20(水) 11:47:31.94
お尋ねします.
mファイルを実行することでコマンドプロンプトを起動し,
さらに命令を与えることは可能でしょうか?
コマンドプロプトを起動することはできたのですが,
命令を与えることができません.
よろしくお願いいたします.

382 :Matlab でもクラス記述できるでしょうか:2011/07/25(月) 22:14:19.58 ?2BP(0)
Matlab でもクラスを扱えるように拡張されていることは知っています。でもクラス
を使った Matlab コードを見たことがありません。Matlab クラスで どの程度のこと
ができるのか、よく分りません。

例えば BL:Bool 体クラス、PL:Bool 体係数多項式クラスを作って、下のような Bool
??体係数多項式の加減乗除べき乗算・剰余算をさせられるでしょうか。

b1=BL(1); b0 = BL(0)
P = PL(b1, b0)

(P^5 + P^3+1)%(P^2+P+1)
===============================
P+1


395 :デフォルトの名無しさん:2011/08/05(金) 11:52:48.09
突然違う話題ですみませんが、
現在、matlabを独学で勉強しています。


以下のような関数がそれぞれどのようなグラフとなるかをmatlabにより出力したいと考えています。
a_±(x) = ±sinθcos(θ/2) * ( cosh(xsinθ) / cosh(2xsinθ)+cosθ ),
b_±(x) = ±sinθsin (θ/2) * ( sinh(xsinθ) / cosh(2xsinθ)+cosθ )

xの値の範囲は-20 < x < +20、θの値の範囲は0 < θ < πです。
xを-20から+20へと変化させた時の波形を出力しようと考えています。
しかし、独学のせいかプログラムが全く書けません(涙)
詳しい方やわかる方、教えて頂けると助かります。




396 :デフォルトの名無しさん:2011/08/05(金) 13:39:19.23
>>395
いきなり完全なプログラムを書こうとしてるから詰まってると見た。

例えば
>> x = -20
>> theta = 0
>> sin(theta)
>> cos(theta / 2)
>> cosh(x * sin(theta))
>> for x = -20:20, x, end

みたいな簡単なステートメントを実行しながら、
まずは代入の記法や、単一の関数で何が得られるかを確かめてみる。
そして、for ループの使い方みたいなものを断片的にでも理解してから
基本はボトムアップで試行錯誤しながら取り組むのが良いと思います。
不格好でも目的のプログラムは作れる筈。

399 :デフォルトの名無しさん:2011/08/06(土) 01:43:47.52
>>396
2重ループでxとθをそれぞれ変化させて、aとbの値を求め、
最後にx,a(もしくはb),θによる3次元のグラフを1つ出力するという方針
なのですが、plot3をどのタイミングで入れれば良いのかがよくわかりません。。
どなたかアドバイスお願いします・・・

400 :デフォルトの名無しさん:2011/08/06(土) 01:57:31.74
>>399
全然違う
独学と言うが何という入門書を読んでる?
ほとんどの入門書に書いてあるはず
>>396の言うとおり、1つの本を決めて最初からサル真似して
打ち込んでいけばそのうち慣れる

401 :デフォルトの名無しさん:2011/08/06(土) 02:29:54.36
>>400
「MATLAB ハンドブック」です。
>>399以外思いつく方法がなかったのですが・・・
やばいです。。

433 :デフォルトの名無しさん: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 でいいじゃないかとか
スペースとかインデントとか

434 :デフォルトの名無しさん: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)));
のように虚数が含まれる場合はどのような手順で解を導けば良いのでしょうか?
課題や研究ではなく、単純に疑問に思いました・・・




466 :デフォルトの名無しさん:2011/09/22(木) 20:49:45.08
すみません、新しい質問なのですが、
画像を数十個出力して、連番になるように保存したいのですが、
どのようにすればよいのでしょうか?
いちいち出力したあとに一個一個saveしていくのは非常に面倒です・・・
また、画像を1つ1つ表示させず、保存のみしていく方法を教えて頂けたら尚嬉しいです。。
コードは以下のように作りまして、testの回数毎にe,f,g,hという関数をグラフとして出力しています
二つめの・・・の部分でe,f,g,hを計算しています。
どなたか分かる方、どの部分にどのようなコードを挿入すべきか教えて頂けると助かります。



495 :デフォルトの名無しさん:2011/10/04(火) 14:59:59.55
z平面に極をプロットしたグラフを
円グラフみたいに扇形で色分けしたいんですが
どうやってやればいいのでしょうか?

503 :デフォルトの名無しさん: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を削除すると、繰り返して座標を取得ができます。
どうすればできますか?

509 :デフォルトの名無しさん:2011/10/12(水) 05:00:42.59
matlabは年に2回とか訳の解らんペースで更新するからなぁ
しかも結構コロコロ関数が変わるし…

それはそうとどなたか>>503頼みます

510 :デフォルトの名無しさん: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;

546 :デフォルトの名無しさん:2011/10/25(火) 04:14:27.25
数秒おきに進行状況を出力する

549 :デフォルトの名無しさん:2011/10/29(土) 22:49:37.58
スクリプトscript内でユーザ定義関数ufuncを使って,scriptを実行するとエラーメッセージ「関数としてスクリプトufuncを実行しようとしています」がでます.
スクリプトフィルscript.m,関数ファイルufunc.mはサーチパス内に保存しています.
原因がわかりません.


script.m内の記述


y=ufunc(x)



ufunc.m内の記述
function y=ufunc(s)
%


y=x+…%計算内容

ちなみに簡単な場合はうまくいきます.
エラーが発生した実際の関数はかなり長い記述です.

よろしくお願いします

552 :デフォルトの名無しさん:2011/10/29(土) 23:58:55.78
>>549
which -all ufunc
の結果は?

579 :デフォルトの名無しさん:2011/11/08(火) 21:02:56.09
Re = zeros(50,2);
x = randn(5000,50);

for h = 3:50
for t = 1:5000 
Mean_d = mean(x(1:t,h));
var1(m) = (sum((x(1:t,h)-Mean_d).^2)/h); 
var2(m) = (sum((x(1:t,h)-Mean_d).^2)/(h-1));
end
Re(n,1) = mean(var1); 
Re(n,2) = mean(var2); 
end

plot(Re(h,1), '-'); 
hold on; 
plot(Re(h,2), '-');

上のプログラムは、「1/nで分散した場合と不偏分散( 1/(n-1) )を比較できるグラフを出力する」ものです
このプログラムは合っていますか?間違っている箇所があれば教えてください

584 :デフォルトの名無しさん:2011/11/09(水) 23:19:35.93
Re = nan(50, 2);
vars = zeros(2, 5000);
x = randn(5000, 50);

for h = 3:50
   xx = x(:, 1:h);
   Mean_d = mean(xx, 2);
   bunsi = sum((xx-repmat(Mean_d, 1, h)).^2, 2);
   vars = [bunsi/h, bunsi/(h-1)];
   Re(h, :) = mean(vars);
end

plot(Re)


585 :デフォルトの名無しさん:2011/11/10(木) 05:54:32.37
メモリに入りきらない大きさの行列を扱いたいのですが、
MATLABである程度効率よくOut-of-coreを実現する方法はありませんか?

OSのスワップを活用する方法は実用的ではありませんでした。

586 :デフォルトの名無しさん:2011/11/10(木) 11:09:32.80
スワップを使うのが実用的でなかったというのは、速度的にということかな?
まぁ小手先の技は使えないでしょう。
Parallel Computing Toolbox 一択では?

589 :デフォルトの名無しさん:2011/11/11(金) 23:15:42.40
>>585
もっと具体的に書いてくれれば

591 :デフォルトの名無しさん:2011/11/11(金) 23:31:30.58
>>586
>>589
ありがとうございます。
問題を簡単化すると、ディスク上にある200GBの行列Aと200GBの行列Bの
積C=A*Bを求めたいと言うことです。

64bit Linux版20011aでSWAPを2TB確保すると、仮想的には
二つの行列がメモリに載ります。そこでC=A*B;すると動くのですが、
2日待っても終わりませんでした。その間のCPU使用率は7%とかなので、
おそらくディスク(SWAP)に激しいランダムRWを行っているからだと思います。

一方、なるべくシーケンシャルに読み込み、シーケンシャルに書き込む
ように作った自作のCプログラムでは、10時間程度で終わります。
こちらのCPU使用率はSIMDは使ってませんが100%です。

行列の積程度なら自作してもいいのですが、
もっと複雑な操作や演算をしようと思ったときに
全部自分で作るのは大変だと思って、質問させていただきました。

お金があれば、>>586さんの仰るように分散配列でメモリを増やせるのですが
貧乏なもので・・・

599 :デフォルトの名無しさん:2011/11/15(火) 18:20:26.59
a =

0.0002 0.0161 0.8165 0.0161 0.0002
としたときに、
X = diag(a)

X =

0.0002 0 0 0 0
0 0.0161 0 0 0
0 0 0.8165 0 0
0 0 0 0.0161 0
0 0 0 0 0.0002
のように5*5の対角行列が出来ると思いますが、
X =

a 0 0 0 0
0 a 0 0 0
0 0 a 0 0
0 0 0 a 0
0 0 0 0 a
のように、125*125の対角行列を作るにはどうすればよいでしょうか?

614 :デフォルトの名無しさん:2011/11/21(月) 18:11:49.60
u=rand(4,4)
u =
0.7094 0.6551 0.9597 0.7513
0.7547 0.1626 0.3404 0.2551
0.2760 0.1190 0.5853 0.5060
0.6797 0.4984 0.2238 0.6991
----------------------------------------
上のように作成したuについて、次のように
uの4行目の全ての要素を1行目の全ての要素に置き換えるようにするには
コマンドラインからだとどのように入力すればよいですか?
( u(1:3 1)とするとダメだったので・・・。愚問ですみません)

u =
0.7094 0.6551 0.9597 0.7513
0.7547 0.1626 0.3404 0.2551
0.2760 0.1190 0.5853 0.5060
0.6797 0.4984 0.2238 0.6991

u =
0.7094 0.6551 0.9597 0.7513
0.7547 0.1626 0.3404 0.2551
0.2760 0.1190 0.5853 0.5060
0.7094 0.6551 0.9597 0.7513


615 :デフォルトの名無しさん:2011/11/21(月) 19:28:52.78
>>614

a = a( [1 2 3 1], : ) ;

or

a(4,:) = a(1,:) ;


616 :デフォルトの名無しさん:2011/11/21(月) 20:06:08.32
>>615
ありがとうございます。
a = a( [1 2 3 1], : ) ;
の形が好ましいのですが,仮に
N=100;
a=rand(N,N) ;
とした場合,
同様にaのN行目の全ての要素を1行目の全ての要素に置き換えるには,
どうすれば良いですか?
a = a( [1 2 … N 1], : ) ;
を書き直したいのですが.


617 :デフォルトの名無しさん:2011/11/21(月) 23:00:23.11
>>616
a = a([1:N-1, 1, N+1:end], :);

じゃないの?

619 :デフォルトの名無しさん:2011/11/22(火) 01:33:44.76
>>616
ところで普通は>>615の前者を使うんだけどなんで後者?

620 :619:2011/11/22(火) 01:34:37.42
訂正:
普通は>>615の後者を使うんだけどなんで前者?

621 :デフォルトの名無しさん:2011/11/22(火) 11:18:40.57
>>620
数式の中で使いたかったのと、代入文を省きたいと考えたので後者を選びました。

>>617
試してみましたが出来ませんでした。。




622 :デフォルトの名無しさん:2011/11/22(火) 11:30:52.15
>>621
どちらでも数式の中で使えるし、どちらも代入文を使っているので、
通常なら >>615 の後者の方がクリアで良いと思うんだけど。

あと、試してみたけど出来ないというのは具体的にどういうこと?
N=100;
a=rand(N,N) ;
a = a([1:N-1, 1, N+1:end], :);
isequal(a(1, :), a(N, :))
を実行してみれば分かるけど、
君の要求である「aのN行目の全ての要素を1行目の全ての要素に置き換える」ことは
出来てる筈。


631 :631:2011/11/25(金) 11:01:18.86
質問です。simulinkでシミュレーションする際に計測された値によってシミュレーションの挙動を制御するためのプログラムを作りたいと思います。
ここでS-functionブロックを使ってif文を使ったプログラミングに挑戦しました。
しかし、エラーがでてしまいます。そもそもS-functionでif文が使えるかも判りません。
以下にプログラムをさらしますので、まずいところを教えてください。

649 :デフォルトの名無しさん:2011/11/29(火) 18:37:46.42
大学院にてmatlabを使用して画像処理を行う事になりました
そこで研究室にあったr2007bをインストールして起動しようとした所
一瞬だけmatlabのロゴだけが映る状態になりmatlabが立ち上がらない状態になりました
タスクマネージャーで確認したら一瞬だけ立ち上がっては消えるみたいです
管理者として実行しようとした所、発行元が不明になっていました
ウイルスソフトといったセキュリティ等に引っかかっているのでしょうか?
OSはwindows7の32bitオペレーションシステムを使用してます

667 :デフォルトの名無しさん:2011/12/08(木) 19:15:18.10
プログラムの質問です。
位相によって1か0を出力するプログラムを組みたいです。
例えば位相0°~120°の間は1を出力する。しかし、それが終わったら0を出力する。
しかし、matlabはラジアン表示です。更に言うのなら位相360°を超えた場合の問題が有ります。
位相360°=0°で考えますが、ラジアン表示ではただ増えていくだけです。
どのようにすれば、定期的に出力できるようになるのでしょうか?

670 :デフォルトの名無しさん:2011/12/08(木) 22:32:43.04
>>667
計算機の替わりに小学生にバイトで計算させるさせると考える。
子供にも出来るよう計算の手順を丁寧に紙に書く。
計算機は小学生よりアホだからそれくらい丁寧に書く必要がある。
それが完成したらそこからコードにするのは簡単。


680 :デフォルトの名無しさん:2011/12/10(土) 11:44:40.96
すみません,1次元の偏微分方程式の解を格納した
uというN×Mの行列があるのですが,
このuの1行目から最後の行までのそれぞれの行ベクトルを
順に表示させたいと考えています.
つまり,アニメーションのように時間発展を表示させたいと考えています.
(今までは単にwaterfallなどを使って表示していました)

やり方などわかる方おられれば教えてください.
また,出来ればそのアニメーションの様子をavi形式などにして,
動画ファイルとして保存したいと思っています.
よろしくお願いします.


813 :デフォルトの名無しさん:2012/06/27(水) 19:37:08.95
A=1:0.1:100;
B=1:0.1:1000;

sum((A-B(1:length(A))).^2)の結果がゼロにならないんですが、
我慢するしかないんでしょうか。
正直この結果にショックを受けています。
浮動小数といっても、ゼロになって然るべきなので。

間隔を0.1ではなく自然数にすると0になります。
Matlab 2011a x64 windowsです。

830 :デフォルトの名無しさん:2012/06/28(木) 23:43:32.22
浮動小数点演算で誤差があるの当たり前だろ

839 :デフォルトの名無しさん:2012/06/30(土) 21:22:55.26
恥ずかしながら今日まで>>813は真だと思っていた。

955 :デフォルトの名無しさん:2012/07/26(木) 13:20:17.89

突然の質問失礼します。
今、max関数を使って絶対値の大きいものを抽出しようとしています。
例えば以下のマトリックスaがあるとします。
0.7419 0.4536 0.9377 0.3272 0.2620
-0.7765 -0.0852 -0.7722 -0.2671 -0.1022
0.2525 0.5864 0.5908 0.8265 0.3716
0.6616 0.5367 0.9436 0.5176 0.1288

この場合、max(a)を使うと、以下のような結果が出てきます。
0.7765 0.5864 0.9436 0.8265 0.3716

しかし、自分の場合、絶対値が大きいものをそのまま抜き出したいので
以下のような形にしたいのです。

-0.7765 0.5864 0.9436 0.8265 0.3716

上記のような結果を出すためには、やはりfor構文を使うしか方法はないのでしょうか?
どのようにして求めているのかという、max関数の中身についてはわかりませんが、
少なくとも11行×3000列ほどありますので、for構文で回しても問題はないですが、
上記のようにmax関数ですぐ求めたいです。

何卒宜しくお願いします。



http://toro.2ch.net/test/read.cgi/tech/1254528108/l50/../人気ブログランキングへ