トップページ⇒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/
0159デフォルトの名無しさん2010/05/28(金) 12:55:07
>>158
ありがとうございます
ちょっと試してみます
0160デフォルトの名無しさん2010/05/28(金) 17:07:15
>>158
plat3で'.'で表示してみましたが、どうも今市です。
具体的なコードを教えていただけませんか?
0161デフォルトの名無しさん2010/05/28(金) 17:21:57
自己解決しました。
ありがとうございました。
0162デフォルトの名無しさん2010/05/28(金) 18:58:14
plot3じゃ、雲のような表現は無理なんじゃない?
0163デフォルトの名無しさん2010/05/30(日) 14:03:27
ふぅ、やっとr2010aダウソ終わったぜ
0164デフォルトの名無しさん2010/06/02(水) 16:26:44
またアップグレードするのか、と思うと気が重いな
0165デフォルトの名無しさん2010/06/03(木) 17:36:49
地図って書かせることできますか?
0166デフォルトの名無しさん2010/06/03(木) 19:25:10
C言語におけるconst修飾子のように
変数の値の変更を禁止するような方法はありませんか?
0167デフォルトの名無しさん2010/06/03(木) 20:37:46
>>165
出来るよ

>>166
あるよ
0168デフォルトの名無しさん2010/06/05(土) 12:28:27
このプログラムが作れません!><;
↓

二重ループを用いて、アスタリスク「*」でn段のピラミッドを作成・表示するプログラムを作成せよ.
(例) n=4 の場合
///*///
//***//
/*****/
*******

※二重ループはfor文を使って下さい。
スラッシュの部分は空白(スペース)です。
#include<stdio.h>

int main ( void )
{
....
0169デフォルトの名無しさん2010/06/05(土) 12:37:28
int n=4, i, j;
printf("n=");
scanf("%d%*c", &n);
for(i=0;i<n;i++){
  for(j=n-1-i;j>0;j--) printf("/");
  for(j=i*2+1;j>0;j--) printf("*");
  for(j=n-1-i;j>0;j--) printf("/");
  printf("\n");
}
0170デフォルトの名無しさん2010/06/05(土) 21:40:50
文字を含むcsvデータを読み込もうとしているのですが、うまく行列に格納する方法が分かりません。
色々と調べてみて、textscanを使うと言うことまでは分かったのですがそれ以上は分かりません・・・
とても基本的な質問で申し訳ありませんが、教えてもらえますでしょうか?
0171デフォルトの名無しさん2010/06/05(土) 22:51:10
すいません。
アスタリスクの問題の質問をしたものです。
書きこんで頂いたプログラムはnをいきなり4と定めていますよね。
そうではなくて…
nの値を実行画面で打ち込んでn段のピラミッドをつくるというプログラムにしたいんです。
あと("/")ではなくて(" ")にしてもう一回教えてもらえませんか?
0172デフォルトの名無しさん2010/06/06(日) 02:40:01
>>171
おまえバカだろ
基本からやり直せ
0173デフォルトの名無しさん2010/06/06(日) 03:13:04
fid = fopen('hoge.csv');
ss = textscan(fid,'%s%s','delimiter',',');
fclose(fid);
てして,ss{i}{j}でアクセス
01741732010/06/06(日) 03:19:53
>>170
カンマ含む文字列があるなら,Excelみたく""でくくって
%qを使うといいぞ
01751692010/06/06(日) 09:01:31
そうだな、スレ違い。
0176デフォルトの名無しさん2010/06/09(水) 21:09:03
MATABのSimukinkuを使ってOFDMのシミュレーションモデルを構築
したいのですが、何をすればいいのかさっぱりです。
基礎知識ってナニが必要ですか?フーリエやら微分方程式って習得
してなきゃまずいですか?
0177デフォルトの名無しさん2010/06/09(水) 22:24:00
豚に真珠、猫に小判という言葉が思い浮かんだ。
0178デフォルトの名無しさん2010/06/10(木) 03:07:49
>> 177
MATLABは人をバカにするきらいがある・・・
かく言う私はMATLABでバカになった.
バカな私でも使えるMATLABは素晴らしい.

>> 176
Simukinku(w
OFDM勉強すればフーリエ変換も勉強できるのでは.
常識だし,勉強するためのちょうどいいチャンスじゃないか.
0179デフォルトの名無しさん2010/06/16(水) 11:29:48
3Dのグラフ描写について教えてください。
真円度計の測定結果のような極座標系の三次元グラフを描きたいと思い、悪戦苦闘しています。
持っている情報としては45゜毎thetaの半径rと高さzがあります。
rを使ってカラーマップを作りたいのでmeshやsurfですと上手くいきませんでした。
海外にはpolar3dやpolarplot3dといった.mファイルがあったのですが
使い方がいけないのか上手く使いこなせなかったです。
極座標系の三次元グラフは不可能ですか?
何かやり方があれば教えてください。
0180デフォルトの名無しさん2010/06/16(水) 16:52:38
デカルト座標から極座標に変換すればいいだけのことでは?
0181デフォルトの名無しさん2010/06/17(木) 00:41:32
すでに極座標系なのですが。。。理解不足ですかね。
極座標系でz軸を使えるものはないですかね。
0182デフォルトの名無しさん2010/06/20(日) 22:26:47
初歩的な質問かもしれませんが、教えてもらえれば幸いです。
二値画像をモルフォロジーに基づくスケルトン化しました。
そのスケルトン化した画像を元の二値画像に戻すにはどのようにプログラムを組めばよいのでしょうか。
また、2次元での画像を極座標変換するにはどうすればよいでしょうか。
よろしくお願いします
0183デフォルトの名無しさん2010/06/24(木) 12:24:33
自分もよく理解できてないからだろうけど、このところ質問の意味が分からん。
0184デフォルトの名無しさん2010/06/26(土) 01:20:57
MATLABのコマンドのode45で運動方程式(微分方程式)Ax''+Bx'+Cx=Fを
解いています(xを求めている)。
運動方程式の入力(Fです)は1-cos(b)でbは時間の関数でb=20*tと
しています。tは時間です。

xはx1とx2からなるベクトルで、Fとx1とx2を同時に出力して
グラフを見比べたいのですが、横軸を時間tではなくbとします。
行列であるAやBやCにtは含まれていないのですが、時間tについて
何も変更せずにグラフを出力すると、Fとx1,x2の波形(振幅値など)が
ずれていました(モデル的に、x1やx2は変位なので入力Fが
大きいときは、x1とx2も大きくなる、つまり振幅の位置が
一致するはずです)。
この原因は横軸がb、つまり20*tなのに、時間tについて何も
変更しなかったからだと思うのですが、どの部分をどのように
変更すれば時間について変更(tではなく20*tにすれば
うまくいくと思います)でき、うまくいくでしょうか?

長くなりましたが、よろしくお願い致します。
0185デフォルトの名無しさん2010/06/27(日) 08:18:02
いえいえこちらこそ宜しく御願いします。
0186デフォルトの名無しさん2010/07/09(金) 02:45:15
あとは、お若い二人でごゆっくりと( ・ω・)y─┛〜〜
01871842010/07/10(土) 12:31:13
自己解決できましたので失礼します。
0188名無しさん@そうだ選挙に行こう2010/07/10(土) 13:04:48
うむ
0189デフォルトの名無しさん2010/07/20(火) 00:04:48
MATLABのプログラミングを使って、音を出すことをしています。
緊急で「小惑星探査機はやぶさ」のカプセルに使われたビーコン音を
作ることになったのですが
作り方が分かりません…。
1024Hzと2048Hzの矩形波が1秒ごとに繰り返していることは
ネットで分かったのですが…

MATLABのプログラミングで作成することは難しいかもしれないですが
よろしくお願いいたします。
0190デフォルトの名無しさん2010/09/19(日) 20:37:28
[x,y]=meshgrid(-10:10:10);
z=exp(x.^2 + y.^2)*(x.^2 + y.^2)
とすると、
z =
1.0e+089 *
2.8904 1.4452 2.8904
0.0000 0.0000 0.0000
2.8904 1.4452 2.8904
となり、x=10,y=0の時と、x=0,y=10の時で計算結果が変わってしまいます。
しかし、
exp(10^2+0^2)*(10^2 + 0^2)と
exp(0^2+10^2)*(0^2 + 10^2)の答えは共に
2.6881e+045
となります。これは計算誤差の問題ですか?
0191デフォルトの名無しさん2010/09/21(火) 02:40:32
>>189
ヒント
ttp://nis-ei.eng.hokudai.ac.jp/~aoki/laboratory04.html
0192デフォルトの名無しさん2010/09/21(火) 02:59:21
>>190
z=exp(x.^2 + y.^2).*(x.^2 + y.^2)
でOK?
0193デフォルトの名無しさん2010/09/21(火) 03:16:27
>>192
ありがとうございます。うまくいきました。
.*で要素単位の乗算を意味するということで、
もっと勉強します。
0194デフォルトの名無しさん2010/10/04(月) 18:28:45
d = eig(A)
が、どのようなアルゴリズムで
固有値を出しているのかを知りたいのですが
公式にいっても載ってませんでした;

ttp://www.mathworks.com/help/ja_JP/techdoc/ref/eig.html
によると、
[V,D] = eig(A, B, flag)
の場合は、
flagでコレスキー分解かQZ アルゴリズムかのどちらかを選べるようです。
指定しない場合はコレスキー分解で固有値を求めると書いてあるので、
d = eig(A)
でもコレスキー分解で固有値を求めていると考えるのが妥当でしょうか。
もし、公式でこのことについて載っているところがあれば教えて下さい。
0195デフォルトの名無しさん2010/10/04(月) 21:14:13
コレスキー分解が使える条件すら理解できてないみたいだけど、
そんな状態でアルゴリズム調べてどうすんの?
0196デフォルトの名無しさん2010/10/04(月) 21:34:48
>>195
コレスキー分解が使える条件は
正定値対称だと思います

ただ単純に知りたいだけです。

英語でもいいのでどこか載っているところを
知っている方がいれば教えていただければと思います
0197デフォルトの名無しさん2010/10/05(火) 00:31:25
>d = eig(A)
>でもコレスキー分解で固有値を求めていると考えるのが妥当でしょうか。

Aが実対称正定値:コレスキー分解
それ以外:QZ分解
って書いてあんじゃん
フラグが明示されない場合は実対称正定値かどうかを内部で判定してるんでしょ
0198デフォルトの名無しさん2010/10/05(火) 00:34:11
ttp://matlab.izmiran.ru/help/techdoc/ref/eig.html
0199デフォルトの名無しさん2010/10/08(金) 15:29:55
学生でmatlab初心者です。自分は64bitのPCを使用しているのですが、
mex-setupコマンドを打ったときコンパイラの選択肢が出てきません。
ネットで多少調べてみたところ、32bit版での方法しか見つかりませんでした。
64bit版でも使用可能なコンパイラはないでしょうか?
基本的な質問なのでしょうが、どなたかご教授お願い致します。
0200デフォルトの名無しさん2010/10/08(金) 15:45:22
199です。OSを書き忘れてました。
windows7を使用してます。
0201デフォルトの名無しさん2010/10/08(金) 20:44:44
正規ユーザならサポートに訊け
0202デフォルトの名無しさん2010/10/10(日) 17:20:29
現在学士4年で修士に進学予定です.
StudentEditionを購入したのですが,インストール時に設定する卒業年は2011年でいいのでしょうか?
修士の二年を考えて2013年でしょうか?
0203デフォルトの名無しさん2010/10/10(日) 19:11:53
だからサポートに聞けって
0204デフォルトの名無しさん2010/10/11(月) 00:45:24
clear all
s=[1 9 1 1 1 ;
2 2 2 2 2 ;
3 2 1 3 8 ;
4 4 2 4 4 ;
5 1 5 5 5 ];
xdiv=2;
ydiv=2;
a1=1;
c1=1;
for j=1:2
for i=1:2
s(a1+(j-1)*ydiv:a1+j*ydiv,c1+(i-1)*xdiv:c1+i*xdiv)
end
end

初歩的ですみません,
上記のようにある行列を分割した後,
それぞれ出た行列を別々の変数にforループを使って格納したいのですが,
どのようにすればよろしいでしょうか?
上は5×5を3×3の4分割にしていますが,
今後は1600×1200に対して同様のプログラムを作成したいと思っています.
0205デフォルトの名無しさん2010/10/12(火) 22:33:13
>>204

セル配列を使って、下から3行目を

t{i, j} = s(a1+(j-1)*ydiv:a1+j*ydiv,c1+(i-1)*xdiv:c1+i*xdiv);

とするか、あるいはevalを使って

eval(sprintf('t%02d%02d = s(a1+(j-1)*ydiv:a1+j*ydiv,c1+(i-1)*xdiv:c1+i*xdiv)', i, j));

とするとか。
0206デフォルトの名無しさん2010/10/13(水) 13:59:38
>>205

ありがとうございますm○mできました!
なるほど,{}を使うとできるんですね
0207デフォルトの名無しさん2010/10/23(土) 12:20:41
画像のサイズを端末上に表示する方法ってありますか?
サイズを変数として使いたいのでimfinfoではダメです
0208デフォルトの名無しさん2010/10/23(土) 17:11:11
size関数しらないって本当にMatlab使いか?
0209デフォルトの名無しさん2010/10/23(土) 22:20:42
行列のサイズではなくて画像の容量を表示させたいのです
0210デフォルトの名無しさん2010/10/25(月) 04:09:33
画像のサイズってファイルサイズのこと?
それだったらdir関数で分かるけど。

a = dir('foo.jpg');
siz = a.bytes;

これでfoo.jpgっていうファイルのファイルサイズが
バイト単位でsizに保存される。
0211デフォルトの名無しさん2010/10/25(月) 17:59:50
>>210
出来ました!
ありがとうございました
0212デフォルトの名無しさん2010/10/28(木) 15:38:09
MATLAB-Simulinkについて質問させてください.
運動方程式をベースに現在モデルを作成しております.

ある入力変位に対する値を出力させるためにLook-up-tableを用いています.
添付画像のようなデータを読み込ませようとしています.
しかし,そのデータの中に不連続な値をとる部分があり(下図の5.5や-5.5と記してある箇所),
ここの値より大きな変異になると,出力する値が無限大になって出てしまいます.

どうしたら正しい値をとるようになるのでしょうか.
些細な情報でも結構ですので,手助け願います.
分かりづらい説明で大変恐縮ですが,ご存知の方おられましたらお願い致します.

http://2sen.dip.jp/cgi-bin/upgun/up1/source/up49199.png
0213デフォルトの名無しさん2010/11/04(木) 23:21:07
すごい単純な質問なんだけど、
5x5の行列AのA(1,2)とA(3,5)を表示したいときに
A([1,3], [2,5])ってやると(1,2),(1,5),(3,2),(3,5)が
表示されちゃうのってどうしたらいい?

5x5くらいじゃ手打ちでいいんだけど、もっと大きくなるとメンド臭くて
0214デフォルトの名無しさん2010/11/05(金) 12:11:40
matlab初心者です、データの補間方法についてお尋ねしたいのですが
http://hccweb5.bai.ne.jp/~hee54201/source/up0521.xls
↑このような配列をこのように処理したいのですがどう書けばよいのでしょうか
宜しくお願いします
0215デフォルトの名無しさん2010/11/06(土) 07:30:32
>>214

for文で各行に繰り返しinterp1を適用していくくらいしか思いつかない。

ttp://infoshako.sk.tsukuba.ac.jp/ShakoDoc/MATLAB5/help/techdoc/ref/interp1.html
0216デフォルトの名無しさん2010/11/07(日) 14:07:37
>>213
k = [
1 3
2 5
3 4];
for n=1:size(k,2)
disp( A(k(n,1), k(n,2)) );
end

かなぁ。
0217デフォルトの名無しさん2010/11/10(水) 18:56:40
一服してくる( ・ω・)y─┛〜〜
0218デフォルトの名無しさん2010/11/15(月) 21:11:21
画像処理が終わった後にお知らせメールが携帯に届く様にしたいんですけど

Could not connect to SMTP host: smtp.live.com, port: 25;

このエラーが出ちゃいます(´・ω・`)
hotmailでもsmtpサーバあるみたいだから出来ると思ったんですけど
ダメなんですかね?
hotmailのsmtpサーバはsmtp.live.comで間違いないと思うのですが…。
2007b使ってます。

% mail settings
setpref( 'Internet', 'SMTP_Server', 'smtp.live.com');
setpref( 'Internet', 'SMTP_Username', 'hotmailのアドレス');
setpref( 'Internet', 'SMTP_Password', 'hotmailのパスワード');
setpref('Internet', 'E_mail', 'hotmailのアドレス');

%メールの送信
mail_to = '携帯のアドレス(ezweb)';
title = '件名';
mail_text = ['本文'];

sendmail(mail_to, title,mail_text)
0219デフォルトの名無しさん2010/11/18(木) 18:42:06
ベクトル(1行の行列)

A=[ 3 5 2 4 7 6 ]

の成分をランダムに並べ替えるような関数ってありますか?
いろいろ調べてみたけど見つからない……
0220デフォルトの名無しさん2010/11/18(木) 19:04:04
各要素は固定でってこと?
0221デフォルトの名無しさん2010/11/18(木) 20:47:10
A=A(:,randperm(length(A)))
0222デフォルトの名無しさん2010/11/21(日) 16:42:51
randpermなんてあったのか
いっつもn=ceil(N*rand(1,1))にしてた
0223デフォルトの名無しさん2010/11/24(水) 20:32:18
あさってはマットラブエックスポ2010だぜ
0224デフォルトの名無しさん2010/11/26(金) 19:44:15
ギロッポン行って来た
みんな高そうな服着てた(´・ω・`)

0225デフォルトの名無しさん2010/11/26(金) 20:12:12
戦利品
http://imepita.jp/20101126/723660
0226デフォルトの名無しさん2010/11/26(金) 21:19:20
去年は弁当だったのに今年はパンでがっかりんこ

0227デフォルトの名無しさん2010/11/28(日) 10:06:20
EXPOなんて行ってたのしいのか?
0228デフォルトの名無しさん2010/12/03(金) 13:19:16
質問です。
C#でデータをDOS画面に出力します。
このデータをMATLABで取得することは可能でしょうか?
データはダダ流し状態なのですべて拾いたいです。
 
 
またはC#のデータをリアルタイムにMATLABで取得することは可能でしょうか?
パイプを使用し同じファイルにアクセスする方法は試したのですが値が取得できませんでした。
 
よろしくお願いします
0229デフォルトの名無しさん2010/12/07(火) 14:05:09
MATLABである行列を作りたいんだけどプログラムが上手くいかない
誰か教えてください
行列Fを作りたいM*(M-1)/2行M列の行列

でm=1~M-1、r=m+1~M、p=1~M それぞれ正の整数
M=5でやってる
Fの要素の指定の仕方が
F((r-m)+(m-1)*(M-m/2)、p)

要素の値なんだけど
-1 if p=m-1
1 if p=r-1
pi*(m-r) if p=M
0 otherwise

02302292010/12/07(火) 14:09:29
スパース行列になるはずなんですけど

今のやり方はones()で同じサイズの行列作って条件に合うように要素を書き換えようとしてます。
for文でm,r,pを書いて、if文を条件に使ってるけど上手くいきません。
いいやり方などあったら教えてください
もしプログラム載せた方がいいなら載せます。
0231デフォルトの名無しさん2010/12/07(火) 20:37:58
MATLABはパイプに対応していますか?
0232デフォルトの名無しさん2010/12/07(火) 21:25:27
>>229
日本語でおk
0233デフォルトの名無しさん2010/12/08(水) 01:14:58
>>229
こういうこと?

M = 5;
row = [];
col = [];
val = [];
for p = 1:M
  for m = 1:(M-1)
    for r = (m+1):M
      i = (r-m)+(m-1)*(M-m/2);
      j = p;
      if p == m-1
    row = [row i]; col = [col j]; val = [val -1];
      elseif p == r-1
    row = [row i]; col = [col j]; val = [val 1];
      elseif p == M
    row = [row i]; col = [col j]; val = [val pi*(m-r)];
      end
    end
  end
end
A = sparse(row, col, val, M*(M-1)/2, M);
spy(A);
0234デフォルトの名無しさん2010/12/09(木) 22:48:20
失礼します。
初歩的な質問で申し訳ないのですが、
GUIのボタングループについてです

GUIDEを用いて、ボタングループ( Tag : uipanel6 )を作成し
その中にラジオボタン( Tag : radiobotton1, radiobutton2, radiobutton3 )を三つ配置しました

ラジオボタンでは、どのボタンを選んでいるかによって
ある変数の値を変えたいと考えているのですが
次のような関数を作っても上手く動いてくれません
----------------------------
function uipael6_SelectionChangeFcn(hObject, eventdata, handles)

test = 1

switch get(eventdata.NewValue, 'Tag')
case 'radiobutton1'
handles.shift = 10
case 'radiobutton2'
handles.shift = 30
otherwise
handles.shift = 50
end

guidata(hObject, handles);
--------------------------------
そもそも、ラジオボタンをどれか選択した時にも
test = 1 の部分がコマンドラインに出てないので
SelectionChangeFcn自体が反応してないようです
なにか他に必要なものがあるのでしょうか
分かる方がいらっしゃったら教えていただけると助かります
よろしくお願いします
0235デフォルトの名無しさん2010/12/09(木) 22:49:54
失礼します
初歩的な質問で申し訳ないのですが、
GUIのボタングループについてです

GUIDEを用いて、ボタングループ( Tag : uipanel6 )を作成し
その中にラジオボタン( Tag : radiobotton1, radiobutton2, radiobutton3 )を三つ配置しました

ラジオボタンでは、どのボタンを選んでいるかによって
ある変数の値を変えたいと考えているのですが
次のような関数を作っても上手く動いてくれません
----------------------------
function uipael6_SelectionChangeFcn(hObject, eventdata, handles)

test = 1

switch get(eventdata.NewValue, 'Tag')
case 'radiobutton1'
handles.shift = 10
case 'radiobutton2'
handles.shift = 30
otherwise
handles.shift = 50
end

guidata(hObject, handles);
--------------------------------
そもそも、ラジオボタンをどれか選択した時にも
test = 1 の部分がコマンドラインに出てないので
SelectionChangeFcn自体が反応してないようです
なにか他に必要なものがあるのでしょうか
分かる方がいらっしゃったら教えていただけると助かります
よろしくお願いします
0236デフォルトの名無しさん2010/12/09(木) 22:52:10
すみません、書き込み失敗とでて連投になってしまいました
お目汚し申し訳ないです
0237デフォルトの名無しさん2010/12/10(金) 22:44:36
なんとか自己解決できました
やはり英語の解説でも
嫌がらずにちゃんと読まないといけないと思わされました
では失礼しました
0238デフォルトの名無しさん2010/12/19(日) 17:59:16
M-ファイルを編集するときのショートカットで、
emacsでいうところの"Ctrl-l" (カーソルを中央に持ってくる) に
相当するようなショートカットは存在しますか?
0239デフォルトの名無しさん2010/12/20(月) 10:47:32
octaveでもmexが動くんでしょうか
0240デフォルトの名無しさん2010/12/20(月) 11:38:56
ggrks
0241デフォルトの名無しさん2010/12/21(火) 11:50:59
昔Cのプログラムをmatlabから利用するにはmexしかなかったのですが
最近は、もっと便利なものがあったりするんでしょうか?
どこかのサイトでclassをそのまま読み込む方法見た気がするんですが
0242デフォルトの名無しさん2010/12/21(火) 17:28:20
ggrks
0243デフォルトの名無しさん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文を使わない形にした方が、高速化できると聞いたのですが、
変形の方法が分かりません。どうか、ご教授下さい。何卒よろしくお願い致します。
0244デフォルトの名無しさん2010/12/30(木) 11:35:10
min(sqrt(a.^2+b.^2))
.^2ってのは要素の2乗のこと。
0245デフォルトの名無しさん2010/12/30(木) 11:36:21
sqrtは外に出したほうがさらに計算量減るね
mindist = sqrt( min(a.^2+b.^2) )
0246デフォルトの名無しさん2010/12/30(木) 11:41:09
和をとるのを忘れてた
sqrt(min(sum( a.^2+b.^2 )))
02472432010/12/30(木) 11:48:39
>>246
aとbの要素数が異なるのですが、大丈夫なのでしょうか?
あと、a.^2、b.^2だとそれぞれのスカラを求めることになるので、
aとbの距離の計算にはなっていないと思うのですが。。。
0248デフォルトの名無しさん2010/12/30(木) 12:17:30
全然勘違いしてたね。申し訳。
全ての組み合わせから最小距離を探すには2重ループしかないと思う
for使わなくて出来るって言った人に訊いてみたらいいんじゃね?
02492432010/12/30(木) 13:09:05
>>248
遅くなりましたが、ご回答ありがとうございました。
http://www.mag.keio.ac.jp/~naoe/inas/pukiwiki/index.php?MATLAB%20Tips
に、forループを使わない方法が書いてあります。
しかし、理解できません。。。
0250デフォルトの名無しさん2010/12/30(木) 15:51:22
>>249のリンク先の話は
数百個のスカラデータの中から最小を探す話だから
2つの行列のすべての組み合わせに対する演算の話ではないな
02512432010/12/30(木) 19:01:30
>>250
やはりforループを使わないとダメなんですね。
ありがとうございました。
0252デフォルトの名無しさん2010/12/30(木) 19:20:28
>>243
こういう風に変形してループを1段に減らしてみるのはどうだろう。

mindist = 2;
for i=1:length(a)
[val, j] = min((a(1,i)-b(1,:)).^2 + (a(2,i)-b(2,:)).^2);
if mindist > val
mindist = val;
ind_i = i;
ind_j = j;
end
end
mindist = sqrt(mindist);

a を2行4000列、b を2行400列として比較すると変形前は56.8秒、変形後は0.218秒だった。
ループ回数は少ないほうがいいので、a と b のサイズを入れ替えて
a を2行400列、b を2行4000列として比較すると変形前は56.4秒、変形後は0.0312秒だった。

変形のポイントは、スカラ変数とベクトル変数の減算を行っていることと min の使い方。
x をスカラ変数、y を n 次元の行ベクトル変数とすると、x-y は [x-y(1), x-y(2), ..., x-y(n)] に等しい。
min は引数にベクトルを与えると最小値に加えて最小値の位置(インデックス)も返してくれる。

ループよりも行列演算として書くほうが速いというのはMATLABで一般的に言えることで、
常にこの点を意識してプログラムを書くとよいと思う。
02532432010/12/31(金) 09:06:20
>>252
この方法は全く想像できなかったです。
コードまで組んでいただき、大変丁寧なご解説ありがとうございました!
かなり処理時間が短縮できたので、できることの幅が広がりました。
感謝しております。
0254デフォルトの名無しさん2010/12/31(金) 22:19:47
>>252さんの例のように、なんでも行列演算にもっていくテクニック
について特にかれたサイトや本はありますでしょうか?
本家にあるTips等は読みました。
0255デフォルトの名無しさん2011/01/01(土) 12:45:29
流れぶったぎってすみません。
自分のPCにインストールしているMATLABの、使用可能なツールボックスが何か
分からなくなりました。
確認する方法ご存じないでしょうか?
0256デフォルトの名無しさん2011/01/01(土) 14:37:12
ver って打ってみろ
0257デフォルトの名無しさん2011/01/01(土) 17:47:17
そもそもmatlabってCとかで組む前にさくっと動作確認をするための物じゃないの?
matlabで高速化頑張っても誰も褒めてくれないでしょ
0258デフォルトの名無しさん2011/01/01(土) 19:29:11
お前がそう思うんならそうなんだろう、お前ん中ではな
■ このスレッドは過去ログ倉庫に格納されています