グッドデザイン賞を受賞したウォーターサーバー >>

matlabで複数条件のif文を行列計算で行うには?

matlabではfor文などは行列計算で回したほうが高速化できると聞きました。
for文でのやりかたはわかったのですが、複数条件でのif文ではどのように書けばよいのでしょうか?

自分のプログラムは以下のようなものです


for i=1:100
for j=1:100
theta_kari=atan(abs(B(j,i))/abs(A(j,i)));
if A(j,i)>=0&&B(j,i)>=0
theta(j,i)=theta_kari;
elseif A(j,i)<0&&B(j,i)>=0
theta(j,i)=theta_kari+(pi/2);
elseif A(j,i)<0&&B(j,i)<0
theta(j,i)=theta_kari+pi;
elseif A(j,i)>=0&&B(j,i)<0
theta(j,i)=theta_kari+(pi/2*3);
end
end
end

よろしくお願いします

このQ&Aに関連する最新のQ&A

A 回答 (1件)

matlab的に一番速いのは



theta = atan(abs(B./abs(A)) + (A<0 & B>=0)*pi/2 + (A<0 & B<0)*pi + (A>=0 & B>=0)*(pi/2*3);

ですかね。
    • good
    • 0
この回答へのお礼

ありがとうございます!

forで回すのに比べて圧倒的に早く、すっきりした形になりました!!

お礼日時:2010/05/18 13:44

このQ&Aに関連する人気のQ&A

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

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

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

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

QMatlabでforやifを使わずに条件に合う行番号の抜き出し方

仮にA=[1 0 1 0 0 1]の行ベクトルがあったとします。
forやifを使わずにAにおいて1が入っている行番号(この場合では1,2,5)を抜き出すにはどうしたらいいのでしょうか。よろしくお願いします。

Aベストアンサー

index = find(A == 1);

で大丈夫かと。

QMATLABにて場合分け関数を定義したい

MATLABの超初心者です.
関数f(x)を定義域により,違う関数で定義したいと考えています.
つまり,
f(x)= f1(x) if x<=5
= f2(x) if x>5

という感じです.なにぶん初心者のため,何を調べればよいのやら途方に暮れています.アドバイスお願いします

Aベストアンサー

いろんなレベルがあるけど x に配列を要求しないなら,
function [y] = foo1(x)
if (x<=5)
y = cos(x);
else
y = sin(x);
end

みたいで良いし, x に配列が入る場合は,

function [y] = foo2(x)

I = find(x<=5);
J = find(x>5);
y = zeros(size(x));
y(I) = x(I).^2 - 2;
y(J) = -2*x(J).^2 + x(J) + 20;

の様な関数でどないでしょう.

Qmatlabで条件をみたしたデータの総数を数えることは可能ですか?

matlabで条件をみたしたデータの総数を数えることは可能ですか?

例として2×5の以下の行列

1 3 0 2 0
1 0 1 2 1

の一行目で0以上の値を持ったデータの総数を知りたいとき(答えは3)

初心者なのでわからないことだらけで困っています。

よろしくお願いします。

.

Aベストアンサー

三度Kulesです。
なるほど、そういうことでしたらANo.2さんの書かれたsumを使う方法がよいでしょう。
sumは合計を出す次元を指定することができますので、
sum(A>0,2)とすれば行ごとの要素数が出ます。
ちなみに列ごとの要素数を出したければ
sum(A>0,1)とすればよいです。

繰り返し、と書かれていますが、Matlabの場合各関数の使い方をよくみてみると
forループなどのループ構文を使わなくても書ける場合が多いです。

以上、参考になれば幸いです。

QMatlab 2行の行列をプロットしたいのですが

こんにちは、Matlabを使い始めのものです。
二行の行列(2x10とか2x40など)にについて、一行目をx座標、二行目をy座標としてグラフ化したいのですが、うまくいきません。
自動的にx座標は列の番号となり、二つのグラフが現れてしまいます:y座標に一行目、二行目、両方がプロットされてしまいます。どうにか、一行目をx、二行目をy座標としてグラフ化できないでしょうか。おそらく、とても単純なことなのかもしれないのですが、どうしてもわからず、とても歯がゆい思いをしています・・・。どうかご教示ください。

何をしたいかといいますと、音声データをMatlabで取り込んだのですが、振幅データがずらっと並んだ、1x500000とかの行列が得られます。
これを、プロットすると、x軸はサンプル番号が並ぶわけですが、本当はx軸は時間であって欲しいため、音声データの行列にひとつ行を足して、時間軸を作ってあげました。つまり、今手元にあるのは、2x500000の行列で、一行目が時間、二行目が振幅となっています。これをx軸が時間軸、でy軸が振幅となるようにグラフ化してあげたいと考えています。

文章がわかり辛くて申し訳ないのですが、何卒よろしくお願いします。

こんにちは、Matlabを使い始めのものです。
二行の行列(2x10とか2x40など)にについて、一行目をx座標、二行目をy座標としてグラフ化したいのですが、うまくいきません。
自動的にx座標は列の番号となり、二つのグラフが現れてしまいます:y座標に一行目、二行目、両方がプロットされてしまいます。どうにか、一行目をx、二行目をy座標としてグラフ化できないでしょうか。おそらく、とても単純なことなのかもしれないのですが、どうしてもわからず、とても歯がゆい思いをしています・・・。どうかご教示くださ...続きを読む

Aベストアンサー

xを2行×N列のマトリクスとして、

figure(1)
plot(x(1,:),x(2,:))
hold on

か分かりやすく、
figure(1)
u=x(1,:);
v=x(2,:);
plot(u,v)
hold on

でいいかと。

QMATLABのfor文の使い方について

MATLAB(というかプログラム)初心者です
下記を教えてください
よろしくお願いいたします

「つくりたいプログラム」

y1=[A B C]
y2=[D E F]



y200=[AA BB CC]

上記のような200個くらいある行列に同じ操作をしたいです

そこでいちばん簡単な構造を考えました
//////////////////////
y1=[A B C]
y2=[D E F]

for i=1:2
Yi=yi*5
end
/////////////
成功イメージは

Y1=[5A 5B 5C]
Y2=[5D 5E 5F]

となってほしいのですが回りません・・・
yiの定義のしかたがわからず困っております
初歩的な質問かもしれませんが教えてくださいよろしくお願いいたします

Aベストアンサー

y1, y2 などを
yi なんかで参照できません.

セルを使って,
y{1} = 行列;
y{2} = 行列;

とかいれて

for i=1:2
Y{i} = 5*y{i};
end

とか

QMATLABで行列を配列に格納する方法

MATLAB初心者で大変申し訳ありませんが、行列の格納の仕方がわからないので、投稿させていただきました。

for k = 1:1:10
k=k;
t(:,:)=load(sprintf('test%5.5i.txt',k));
end
具体的に言いますと、上記のプログラムで、test00001~test00010.txtというファイルを任意の行列t(:,:)で読み込んでいるのですが、このt(:,:)をkと対応させて、例えばk=1の場合のtをt[1]、k=2の場合のtをt[2]などの配列に格納し、それを自由に呼び出し、計算を行いたいと考えております。
基礎がわかっていないためにどうしていいかわかりません。
宜しく御願いします。

Aベストアンサー

構造体を使うのが一番スマートでしょうか。

for k = 1:10
 FILE_DATA(k).t(:, :) = load(sprintf('test%5.5i.txt', k));
end

これで、FILE_DATA(1)~FILE_DATA(10)それぞれに行列tが格納されます。

QMATLABで小数を整数にするには?

タイトル通りなんですがMATLABで小数の値を小数点以下切捨てなどで整数にする方法はありますか?

Aベストアンサー

floorとかroundを使えばいいんじゃないでしょうか?
正の数であれば、floorが切り捨て、roundが四捨五入です。

参考URL:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/ref/floor.shtml

QMATLAB で 連番処理をしたい

matalabで画像処理をしたいのですが、 同じ処理を複数回、違う変数に対して行いたいのですがやり方がよくわからりません。

たとえば、
[output1 ,model_color1] = func_AAAA( imgdata,center1);
[output2 ,model_color2] = func_AAAA( imgdata,center2);

[output10 ,model_color10] = func_AAAA( imgdata,center10);
というようなことを行いたいのですが、
いちいち全部記述すると
output5までしかいらない時にわざわざ6~10を消さなければならないので
for文を使って書けるようにしたいと考えています
イメージとしては下のように処理したいのですがこれでは当然エラーになります。
for NUM=1:10
[outputNUM ,model_colorNUM] = func_AAAA( imgdata,centerNUM);
end

num2strを使えばできそうな感じがするのですがどのようにすればよいでしょうか?
お願いします

matalabで画像処理をしたいのですが、 同じ処理を複数回、違う変数に対して行いたいのですがやり方がよくわからりません。

たとえば、
[output1 ,model_color1] = func_AAAA( imgdata,center1);
[output2 ,model_color2] = func_AAAA( imgdata,center2);

[output10 ,model_color10] = func_AAAA( imgdata,center10);
というようなことを行いたいのですが、
いちいち全部記述すると
output5までしかいらない時にわざわざ6~10を消さなければならないので
for文を使って書けるようにしたいと考えています
...続きを読む

Aベストアンサー

cell array を使って,

for NUM=1:10
[output{NUM} ,model_color{NUM}] = func_AAAA( imgdata,center{NUM});
end

こんな感じに書けば,loop できる

doc の matlab-> Programing -> Data Types -> Cell Arrays
辺りを参考にすること.

QMATLABのCSV形式での書き込みについて

MATLABにて計算させた結果をCSV形式で出力したいのですが,
もともとCSVファイルに書き込んであるデータを消さずに,
追加書き込みとして,行と列を指定して書き込み出来るのでしょうか?

もしできるのであれば,
どのようなプログラムを組めばよいのでしょうか?
どなたかご教授お願いします.

Aベストアンサー

speedとpowerはdouble型の行列ですよね?

fwrite関数はバイナリ保存関数ですので、CSV形式(=テキスト形式)での保存はできません。
dlmwrite関数では小数点以下12桁までを指定して保存していますので、fprintf関数を使用すれば良いのではないかと思います。
なお、fprintf関数を使用する場合は、区切文字(,)や改行は自動で追加されませんので、以下のように記述する必要があります。

fprintf(fid, '%.12f,', speed);
fprintf(fid, '\n');
fprintf(fid, '%.12f,', power);
fprintf(fid, '\n');

ただ、この方法では各行の末尾にもカンマが出力されますので、それを抑止したい場合は、speedとpowerの各要素をループの中で保存してください。

■ fprintf関数
http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/techdoc/ref/fprintf.html


また、プログラムではfor文の中でfopenとfcloseを繰り返していますが、余り良いことではありません。見たところファイル名は一定のようですので、fopenとfcloseはfor文の外でするべきだと思います。そうすれば処理速度も向上しますし、別に追記でfopenする必要もありません。

fid = fopen('file1.csv', 'w');
for
fprintf(fid, ....);
end
fclose(fid);


最後に、この場合はファイルの出力方法を変更する以外に、speedとpowerをループ回数分保存するように変更する方法もあるのではないかと思います。

speedとpowerはdouble型の行列ですよね?

fwrite関数はバイナリ保存関数ですので、CSV形式(=テキスト形式)での保存はできません。
dlmwrite関数では小数点以下12桁までを指定して保存していますので、fprintf関数を使用すれば良いのではないかと思います。
なお、fprintf関数を使用する場合は、区切文字(,)や改行は自動で追加されませんので、以下のように記述する必要があります。

fprintf(fid, '%.12f,', speed);
fprintf(fid, '\n');
fprintf(fid, '%.12f,', power);
fprintf(fid, '\n');

た...続きを読む

Qmatlabで計算終了

matlabで計算を終了させる方法を教えてください。

exitだとプログラム本体が落ちてしまい、
pauseだと一時停止状態となっていますが、
計算のみを停止させるにはどういうコードを使えば良いですか?

Aベストアンサー

特定の行以降の計算を終了したいのであればreturn
forやwhileなどのループから抜けたいのであればbreak(returnでも終われる)
ですかね。

参考になれば幸いです。


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

人気Q&Aランキング