MATLAB function 配列(ベクトル)入力

32 views (last 30 days)
Kimiyasu Sasaki
Kimiyasu Sasaki on 12 Dec 2019
Answered: Kimiyasu Sasaki on 13 Dec 2019
MATLABのMファイルで関数を定義する際に入力の値で条件付けて出力するという基本的な関数を書きたいのですが、出力が思う通りに行きません。
function y = func(x)
for i:length(x)
if (x(i) > = 1) && (x(i) < 2)
y = x;
elseif (x(i) >= 2) && (x(i) < 3)
y = x + 1;
else
y = x + 2;
end
end
end
上記のような簡単な関数ですが、xがスカラ値のときは思い通りの値が出てくれます。しかしながら、xがベクトル値のとき例えば、x = [1 2 3 4]'
に対して、y = [3 4 5 6]'となり、どうやら全てelseのときの条件と判定されてしまいます。(この場合は y = [1 3 5 6]'と出てほしいのですが)
どこか記述の仕方が悪いのでしょうか?
基本的なことで恐れ入りますが、どこが間違えでどのようにすればよろしいかご教授いただけませんでしょうか?
以上、よろしくお願いいたします。

Accepted Answer

Shunichi Kusano
Shunichi Kusano on 12 Dec 2019
配列であっても、1要素ずつ判定を行って処理をしたい、ということでよろしいでしょうか。
現状のコードですと、判定の部分は問題ないのですが、処理の部分に要素の指定が抜けていて、配列全部に処理が行われる仕様になっています。
ですので、例えば一個目の条件では
y(i) = x(i);
と処理する要素を指定すれば、とりあえずは思った通りの処理になると思います。
なお、このくらいであればいいのですが、もっと配列が大きくなってくるとfor文は避けた方がいいと思いました。興味がありましたらfind関数なんかを調べてみると参考になるかと思います。
  1 Comment
Kenta
Kenta on 12 Dec 2019
function y = func(x)
for i=1:length(x)
if (x(i) >= 1) && (x(i) < 2)
y(i) = x(i);
elseif (x(i) >= 2) && (x(i) < 3)
y(i) = x(i) + 1;
else
y(i) = x(i) + 2;
end
end
end
こんにちは、こんな感じでx(i)などとし、i=1:lengthとすれば実行できます。

Sign in to comment.

More Answers (1)

Kimiyasu Sasaki
Kimiyasu Sasaki on 13 Dec 2019
ご丁寧なご回答ありがとうございました。
実はこの質問を投稿した後で、私のように定義した場合、z = arrayfun(@func,x)とすればいいとわかりました。
ご回答いただいた方法がいいと思いますので、ぜひそのようにコーディングします。
find関数の件もありがとうございます。こちらも調べてみます。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!