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

15 Ansichten (letzte 30 Tage)
Kimiyasu Sasaki
Kimiyasu Sasaki am 12 Dez. 2019
Beantwortet: Kimiyasu Sasaki am 13 Dez. 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]'と出てほしいのですが)
どこか記述の仕方が悪いのでしょうか?
基本的なことで恐れ入りますが、どこが間違えでどのようにすればよろしいかご教授いただけませんでしょうか?
以上、よろしくお願いいたします。

Akzeptierte Antwort

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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

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

Kategorien

Mehr zu Logical finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!