• ベストアンサー

【MATLAB】配列内の数値のキャンセル方法

MATLAB という汎用数値解析プログラムを使っています。 現在、100×100の配列の中にランダムな数字(0~40)が入ったデータを扱っています。 しかし、中にはマイナスの値や100を超える値も時々入ってしまっています。 できれば0~40の間の値の中で平均値や最大・最小値を算出したいと考えています。 この外れ値を計算せず(もしマイナスや40以上ならその値は無かったことにして)平均値等を出すことは可能でしょうか? if文なども考えたのですが、いまいち書き方が分からず困っています。 どうかご回答よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • m0r1_2006
  • ベストアンサー率36% (169/464)
回答No.3

こんな感じ >> B = rand(5) B = 0.8147 0.0975 0.1576 0.1419 0.6557 0.9058 0.2785 0.9706 0.4218 0.0357 0.1270 0.5469 0.9572 0.9157 0.8491 0.9134 0.9575 0.4854 0.7922 0.9340 0.6324 0.9649 0.8003 0.9595 0.6787 >> ind = find((B>0.5) & (B<0.8)) %%%% 行列 B の中から, 0.5 < B < 0.8 のインデックスを取り出す. ind = 5 8 19 21 25 >> A = B(ind) A = 0.6324 0.5469 0.7922 0.6557 0.6787 A の平均とか min max を取る. ただし,B の行列としての 2次元情報が消えるので, それを生かしたいときはもう少し工夫が必要.

okmijnuhbygv
質問者

お礼

ありがとうございます。 2次元情報自体は使用せず、平均や標準偏差が欲しかったのでこれで十分です。 色々勉強したいところなんですけど、しばらくそこに割ける時間が無いので本当に助かりました。

その他の回答 (2)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

まあ確かに先の回答者さんが書かれている通り、二重のforループを使ってやる分には C言語なんかでも初級編ぐらいの問題なので自分でして欲しいところなんですが、 Matlab風なやり方を少しでもするなら、 Aを100×100の行列として B=A(:); とすればBはAと同じ値が入った10000×1の行列になります(私が前回の回答で書いたものです)ので、 forループは一重で済みますね。 もうひとつMatlabの特徴として、配列のインデックスの代わりにlogicalが直接使えるというものがあります。 つまり、例えばCを1×5の行列だとすると、 D=C([1,3,5]);とするのとD=C[true;false;true;false;true]); とするのは同じ結果を返してくれます。 この2つのことを使えば、forループを一度も使わずに求めることができますね。 これ以上は自力でやった方がいいでしょう。 特に2つ目の事実はその手の本を読まないとわからないところです (最初のうちは読んでも意味がわからないと思います。私もMatlabに触り始めた頃はそうでした) が、ここから先は普通のプログラムの話なので自分で書かないと力がつきません。 参考になれば幸いです。

okmijnuhbygv
質問者

お礼

またご回答いただけて嬉しいです。 もう少し勉強して力をつけていきたいと思います。 ありがとうございました。

  • k_kota
  • ベストアンサー率19% (434/2186)
回答No.1

まあ、MATLABらしくは無いですけど2重ループで所望の範囲の値の個数と合計を求めればいいんじゃないでしょうか。 ここから先は自分で考えたほうがいいと思います。 基本的な内容ですので、これが出来ないとプログラムが絶望的だと思います。

okmijnuhbygv
質問者

お礼

ご回答いただき、ありがとうございます。 一気に外れ値をキャンセルするのは無理ですか・・・ 仰る通り、プログラムは絶望的です(;_;) 単純なプログラムにも悪戦苦闘し、たくさん時間を使ったのに分からずじまい・・・ なんてことも多々あります。 環境上、独学で学んでいるのも原因ですが・・・ 幸い(一般的には)難しい事はしないようなので、あと5ヶ月だけの我慢だとがんばります。

関連するQ&A