MATLABプログラミング 質問箱 その4
>>1 乙です。即死回避保守。 simulinkって制御に使う他に、 Scratchみたいなビジュアルプログラミング言語として遊べるかな? windowsなんかでparfor使った場合、マルチスレッドと言えばいいのかな?マルチプロセス? タスクマネージャ見ると1人のworkerは1つのプロセスみたいだけど 突然の質問失礼します。 if文を一つだけ抜けさせるbreak構文はどうしたらよいのでしょうか? 例えば、 for i=1:100 ~ ~ for j=1:1000 if ある条件 ~ else ここである条件で抜ける(Aへ) ~ ~ end end @ end A 上記のように@へ抜けさせたいのですが、break構文を使うと、 Aにいってしまい、終了してしまいます。。 breakで@へいって、再度iの続きをさせたいのですが、どのようにやればよいのでしょうか? なお、for jからendまで数千行あるため、ある条件で@へ出させることができれば、 非常に効率が良いです。 Aに行ったんじゃなくてどっかにreturnがあってそこで終了してたとか すみません、質問なんですが3次元の疎行列とスカラーの積を求めようとすると 以下のようなエラーが出てしまいます。 p = 18 x 24 x 4 doubleの疎行列 wx = 0.95 a = wx * p Error using .* ND-sparse arrays are not supported. この計算を行うにはどのように書けば良いでしょうか? >>5 6のいうとおり、breakなら(1)に行くと思う。 (1)の前のあたりまで戻りたいのであればcontinueが使えるかも。 どっかバグってんじゃね その数千行を整理していけば直るのでは 質問です. uigetdir関数を用いてディレクトリへのパスを変数dir_pathに入力する関数Aを作成しました. 再度関数Aを使用する際,uigetdir関数のオプションにある,デフォルトのディレクトリを前回指定したdir_pathに設定する仕様にしたいと考えています. しかし,関数Aの冒頭でdir_pathを読み込んだ場合,初実行の場合”未定義の変数”としてエラーを吐き出してしまいます. 何か良い方法はありませんでしょうか? すまん、割れって? いやオクで買っても仕方ないのかなと。 macにおいてMATLABを使用している者です latexを使用するためにいろいろ設定したところプログラムが実行はできるもののずっと回帰せずにこまっています 参考にしたのが http://osksn2.hep.sci.osaka-u.ac.jp/ ~taku/osx/install_xtexgsgv.html なんですがこのページの(0.下準備)のところでターミナルでecho $shellを実行したら /bin/bash と表示されたので説明に従いコマンドを実行したのが原因かとおもわれます macについてあまり詳しくないのでどうすればいいのか調べているところですがわかる方いましたらご教授おねがいします >>14 mファイル実行なら自動的にdir_pathはワークスペース変数に保存されて 14が考えているようにできるんだが, 関数実行だとワークスペースに保存されないから matlabのワークスペースに保存すれようにすればいい。保存場所は関数Aと同じ場所。 matファイルの保存方法はhelpを見てちょ。 >>14 言い忘れた。 1:関数Aの最初で,dir_pathをloadね。 2:uigetdir使ったらdir_pathを更新。 3:save >>4 皆が言ってるようにbreakで@に出るはず。 あと、毎回言って得るんだが、matlabでforの2重ループはやらんほうがいい。 行列使うかreshapeで一次元化してやれ。 インタラクティブチュートリアルに登録するために必要事項を入力し、登録ボタンを押したのですが、 We're Sorry - an error has occurred We apologize for the inconvenience. This error has been automatically reported to MathWorks. We will fix this as soon as possible. というエラーがかえってきてしまいます。 なぜでしょうか。 Chrome, Firefox, Safariそれぞれ試してみましたが、どれもダメでした。 OS X 10.7.3です。 え、おれ行列要素の操作に二重for使ってしまうんだけど、どうするのが正しいんだろう >>25 やりたい処理による どんな処理してるの? あるディレクトリないのものでループさせるとき、 Bシェルでfor day in `ls dir`みたいに書くのをMATLABだとどういう風になるのか教えて下さい。 ちなみにあるディレクトリは日付のディレクトリです。 >>26 やってるのは画像処理だけど、たとえばxyの添字が共に奇数、共に偶数、それ以外、に分解するとか。 他には、各要素の上下の差と左右の差を求めて、差異が小さい方の平均値で置き換えるとか。 あともっと単純なのだと、各要素がある値より大きければその値で置き換えるってのもあったな。 適した機能があるか調べるよりループで書いちゃった方が早かったんで。 >>27 日付のアドレスのファイル名を取得したいということ? files = dir('日付のアドレス'); filenames = {files.name}; for i = 1: length(filenames) if strcmp(filenames{i},'.') || strcmp(filenames{i},'..') filenames(i) = []; end end filenames{:} %<-ファイル名表示 今, matlabないから動作確認はしとらん。 質問抽象的すぎ。 >>28 差とるんだったらdiffとかbsxfun使えよ。 >>28 俺も画像処理だから多分こんな感じ ひとつめ I(1:2:end,1:2:end)=処理; ふたつめ conv2とfindつかったら? みっつめ I(I>0.5)=1; 画像処理でfor文は基本NG てかmatlabはそういう使い方するもんじゃない 固定のフィルタではconv2を使っていたけど、条件によって処理が別れる場合 どうすればいいかわかんなかった。findでできるんであれば調べてみるよ。 3番目はそのまんまの機能があったんだな。 25です。29さん、ありがとうございます。 抽象的ですいませんでした。 具体的な質問は、DATEというディレクトリ内には120923、120924、 120925などというディレクトリがあります。 Bシェルだとfor day in 120923 120924 120925や、 for day in `ls $DATE`などとループを回していたのですが、MATLABでは どのようなループになるか教えて下さい。 お願いします。 >>33 FOLDERZ = dir('DATE'); FOLNAMES = {FOLDERZ.name}; filenames = FOLNAMES(3:end);%必ず相対パス'.'と'..'が最初に来ると仮定すると コマンドウィンドウ >>filenames(:)%<-表示 ans = '120923' '120924' . . . >>filenames{:}%<-表示 ans = 120923 ans= 120924 . . . てな感じ >>29 の訂正 FOLDERZ = dir('DATE'); FOLNAMES = {FOLDERZ.name}; FOLNUM = length(FOLNAMES); FOLNAMENEW =[]; for i = 1:FOLNUM if ~strcmp(FOLNAMES{i},'.') && ~strcmp(FOLNAMES{i},'..') FOLNAMENEW = [ FOLNAMENEW ,{FOLNAMES{i}}];%あまり書き方よくない end end 34さん ありがとうございます。 なかなかうまくいきませんが、 もう少しあがいてみます。 TV法ていろんなやり方あるけど導出をやってる論文で日本語のものありますか? 典型的なものから応用してるのまでどれでもいいです 現在 windows7 64bit で Matlab 2007b を使用しています。 mex -setup コマンドを試したところ、Noneしか出ずにコンパイラを選択することができません。 C++コンパイラを使用したいのですが、この場合何をインストールすればよいのでしょうか。 現在visual C++ 2008 express edition と 2010 express edition はインストール済みです。 どなたかOS:windows7 64bitを使用していてgetframeで問題が出てる人いませんか? for文を回す中でgetframeで逐次ウィンドウをキャプチャしていくコードを組んでいるのですが なぜか最初の1フレーム目のみを延々とループ回数分だけキャプチャしてしまいます windowsXP32bitではこんなエラー出なかったのですが・・・ どなたか心当たりのある方いらっしゃいましたらご教授いただければと思います よろしくお願いします windows7で2012aを使っております。 mathworks製のツールボックスで使われているクラスにメソッドを追加したいのですが、 自分以外のユーザーに影響を与えないようにする方法はありますでしょうか? 具体的には、symbolicツールボックスのsymクラスにないmin()などを追加したい場合などです。 \toolbox\symbolic\symbolic\@sym フォルダに書かず、 C:\Users\ユーザー名 以下に書いたりできるのでしょうか? symをオレオレクラスに継承するしかないでしょうか? 40です 解決はできていませんが原因は分かったので、一助になればと思いこちらに報告します どうもgetframeで取得したい軸または図に set(gca,'Facealpha',0.5) などと透過率を設定してやると>>40 の症状が発生するようです どうぞご注意を >> 40 Renderer変えると治るかも OpenGLでダメだったことがあって、zbuffurとかに変えたら治った気がする set(gcf,'Renderer','zbuffer') みたいな感じだったと思う >> 43 そもそもaxesプロパティでFacealpha設定できねーし。 patch かsurf の軸ハンドルを設定したんだろ。 try catchで囲ってエラー出なかっただけじゃね。 y=1/det(diag[exp(x),exp(2x),exp(3x)]^2) (diagは対角行列,detは行列式) (xは変数で1から10など好きに変化させる。) このような物を計算し、x,y平面でグラフを書きたいのだが、 (本当はもう少し複雑な式ですが、簡易化してる。) x=1:1:10 A=[exp(x) 0 0; 0 exp(2*x) 0; 0 0 exp(3*x)] z=det(A) としてもエラーが出てしまうんだよ 配列型のソフトだから上手くいかないのはあとでわかったのだけど、 上手く行列内に関数を入れることはできるのでしょうか? できるのであればその定義の仕方を教えろください。 2次元正規分布の描画を平均ベクトル(2*1)と分散共分散行列(2*2)の値を代入した変数から行う 関数を作成したい ---------------------------------- function 2dim_Seiki(x,m,Cov) [x,y] = meshgrid(linspace(-1,3,25)',linspace(-3,1,25)'); X = [x(:) ; y(:)]; Out = mvncdf(X,m,Cov); surf(x,y,reshape(Out,25,25)); return; ------------------------------- ここまでmファイルを作成しましたがエラーになってしまいます やり方を教えてください。おねがいします! >>47 変数名の先頭に数字を入れている時点で論外 もっと勉強しな。かす。 >>49 変数先頭を修正しました。ありがとうございます そして、どうかカスな私にやり方をおしえてください あれから下のような関数を考え、実行しましたがエラーになってしまいます Pdf = 1/(sqrt(2*pi)).^-2.*sqrt(det(Cov)).^-1.*exp(-5.*(X-m).'.*inv(Cov).*(X-m)); >>50 エラーならエラーを書け。 長い式は一時変数を使ってどんどん分解していけば人に聞く前に アホでも気付く。 ここは宿題丸投げスレじゃない。 それに式自体あっちこっち間違ってる。 正定ならcholつかう。 ベクトル化する前に、スカラ出力が正しいかするのが先。 >>51 ありがとうございます。一度、一時変数を使用します エラーは"行列の次元は同じである必要があります"と表示されます 何度か修正しましたが、改善されず上と同じエラーは出ます 現在下のような形になってます Pdf = 1/(sqrt(2*pi))^(-2/2)*sqrt(det(Cov))^(-1/2).*exp(-(X(:)-mu)'*inv(Cov)*(X(:) - mu)/2); 間違っている個所についてヒントで十分ですので、どうかご教授をおねがいします >>52 それだけ見ても分からん。変数の次元が違うなら次元が違うわけで各size()は? Xは(:)しちゃあかんでしょ。 データの数xデータの次元 なんじゃ? >>53-54 ありがとうございます 早速調べたいと思います MatlabのGuiはOctaveでも使えますか?おしえてください >>60 どうしても使えるようにしたいのですが、MATLAB以外のソフトで方法はないのでしょうか? MATLAB互換の関数がOctaveにあれば可能 なければ自作しろ 質問です guideで作成したツールのウィンドウを閉じたときに処理を追加したいのですが どうすればいいのでしょうか? 質問です Matlabで画像とか絵の傾きを検出する方法ってありますか? 何を基準に傾きを出すのかしらんけど、MATLABじゃなくて画像処理全般の話題だろ 幾何モーメントとか勾配ヒストグラムとか方法は色々ある MATLABを用いて時系列データに対して、 周波数領域でバンドパスフィルタをかけたいのですが ネットで探しても時間領域でのフィルタについてしか でてきません。どなたか教えていただけますか? >>73 周波数カットするのに時系列のフィルターは使えないってことみたいだけど、 時系列のフィルターかければ周波数カットされる FFT解析で周波数分かるから、フィルターかける前と後で比べてみれば良いと思う FFTはググって 質問の意味が違ってたらすまん >>73 MATLAB helpや参考書など大量に情報はあるぞ。デジタルフィルターを学ぶと確実に書いて有ること。 単に周波数領域というかデジタルフィルターを理解してないのでは? コマンドだと、fft、ifft の使い方がわかれば理解できる >>74 ×時系列のフィルター ○時間領域でのフィルター だった。 代行書き込みなので、書き込みが遅くなったらすまん フーリエ変換に関する質問なんだけど Simulink上で0~n*Ts(n:サンプリング数,Ts:サンプル時間)の間実行して 得られたデータをfftかけるわけだけどもこの時時間軸のデータ個数は(n+1)個あるので一番初めの0秒のときのデータを削ってるんだけど合ってるのか不安 シミュレーション時間を長めにとったほうがいいんだろうか? 用途次第なのでなんとも 定常のときはデータ数多いほうが安定になる >>78 おいおい >>77 fftの周波数分解能はシミュレーション時間で決まる 別にt=0を削っても問題はないけど、もうちょっと調べてから使うべきじゃないか 最近workspaceの画面サイズを変更すると2分くらい固まるようになりました。 設定をいじったことが原因な気がするのですけど、何か原因に心当たりないでしょうか? >>80 > fftの周波数分解能はシミュレーション時間で決まる > 別にt=0を削っても問題はないけど、もうちょっと調べてから使うべきじゃないか ばかかおまえ シミュレーション時間っていう言葉がそもそも間違ってるじゃんw >>83 メモリは8G積んであるのだけど、スワップが起こってるんでしょうかね? ひとまず再インストールしたら快適になったので、様子見してみます。 また同じ症状が起こったら原因特定して報告したいところ。 各変数a~fにそれぞれ数字1~6を割り当てたくて下のように二行に分けてるけど もっとスマートに一行で書く方法ないですか? 変数の名前に意味もたせてるから変数を配列にするのはナシで。 temp = num2cell(1:6); [a,b,c,d,e,f] = deal(temp{:}); matlabで微分したいのですが syms x y z A=x^2+y^2+z^2 B=diff(A,x) %Aの式をxで微分 実行 → ans=2x だと通常通りできるのですが↑式を A=(x(1))^2+(x(2))^2+(x(3))^2 としてx(1)で微分して 実行 → ans=2x(1) と言う風に引数でしたいのですが symsで宣言できなかったりします。 どうすればよいでしょうか?教えてください。 Symbolic Math Toolboxがインストールされてないに一票 matlabで画像処理をしています 画像の各画素の青の値に常用対数をとり、その平均値を出したいのですが その値が-infになってしまいます どうしたらよいでしょうか?よろしくお願いします A = imread('image.bmp'); blue = A(:,:,3); blueD = double(blue); bLog = log10(blue); baverage = mean2(bLog); >>92 そういった経験がなく画像の常用対数の平均値を出すことの意義が分からないのではっきりした解決策は出せませんが 常用対数を出した時点 bLog=log10(blueD); で青の信号が0の要素は-infになってしまいます。 -infが混じった平均をとると結果も-infになります。 なので常用対数をとる前にblueDの0の要素だけ例外処理するなりしないといけません。 ただ、例外処理の先をどう扱うか(例えば-1扱いにするか平均から除外するか)で結果も変わると思います。 相対値だけが問題なのであればblueDの全要素に+1するという手もありますが。 前者の場合はif文使うぐらいしか思い浮かびません。 もっと上手い手もあるかもしれませんがこれぐらいでご勘弁を >>92 対数で-Infがでるときは min(blue) max(blue) まずこれを確認する 回避策としては0をNaNで置き換えて(findを使う) 対数をとって NaNで置き換えた要素に何かを入れる(何を入れるかはその後の処理に依存) MATLAB Corder使っている方いませんかMATLAB言語からC/C++コードを直接生成したいのですが、お値段が高く・・買えないです。 一部のブログラムだけ変換していただけないでしょうか。 こちらのほうに連絡していただければプログラムを送信しますのでよろしくお願いします。 uerihufour@yahoo.co.jp skypeID:yusuke-0727 図々しい質問をしているのはわかっていますが本当に困っているのでよろしくお願いします m(__)m simulinkモデルからreal-time workshopでコード生成してみたけど、出来たコード重くてあかん。最適化のチェックはいれてるんじゃが。なんかコツがあるのかな。 コツご存知の方、ご教授ください。 微分方程式を解いたあとに特定の時間の値を求めるのはどうすればよいのですか? >>81 ですが、近頃また調子が悪くなってきていました。 先ほど、警告: com.mathworks.mde.explorer.Explorer を作成できません。 というエラーが出たためググったところ http://www.mathworks.co.jp/support/solutions/ja/data/1-H9I9LH/index.html?product=ML& ;solution=1-H9I9LH このページがヒット。載っている通りにリネームしたら一気に軽くなったので、 >>81 も何かファイルが破損していたのが原因だった可能性が高そうです。 >>95 本家のHPでチラッと見たけど、最近のscipyってcのコードを生成するんじゃねーの? read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる