MATLAB Answers

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

3 views (last 30 days)
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]'と出てほしいのですが)
どこか記述の仕方が悪いのでしょうか?
基本的なことで恐れ入りますが、どこが間違えでどのようにすればよろしいかご教授いただけませんでしょうか?
以上、よろしくお願いいたします。

  0 Comments

Sign in to comment.

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関数の件もありがとうございます。こちらも調べてみます。

  0 Comments

Sign in to comment.

Sign in to answer this question.