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

18 vues (au cours des 30 derniers jours)
Kimiyasu Sasaki
Kimiyasu Sasaki le 12 Déc 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]'と出てほしいのですが)
どこか記述の仕方が悪いのでしょうか?
基本的なことで恐れ入りますが、どこが間違えでどのようにすればよろしいかご教授いただけませんでしょうか?
以上、よろしくお願いいたします。

Réponse acceptée

Shunichi Kusano
Shunichi Kusano le 12 Déc 2019
配列であっても、1要素ずつ判定を行って処理をしたい、ということでよろしいでしょうか。
現状のコードですと、判定の部分は問題ないのですが、処理の部分に要素の指定が抜けていて、配列全部に処理が行われる仕様になっています。
ですので、例えば一個目の条件では
y(i) = x(i);
と処理する要素を指定すれば、とりあえずは思った通りの処理になると思います。
なお、このくらいであればいいのですが、もっと配列が大きくなってくるとfor文は避けた方がいいと思いました。興味がありましたらfind関数なんかを調べてみると参考になるかと思います。
  1 commentaire
Kenta
Kenta le 12 Déc 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とすれば実行できます。

Connectez-vous pour commenter.

Plus de réponses (1)

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

Catégories

En savoir plus sur Logical dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!