【初歩的質問】トライ​アル版の関数fitで​ガウス近似(指数近似​)を行いたいのですが​、うまくいきません。

12 ビュー (過去 30 日間)
Takeru Katagiri
Takeru Katagiri 2020 年 5 月 13 日
コメント済み: Takeru Katagiri 2020 年 5 月 21 日
上記のURLの手順で、ガウス モデルによる対話的な近似 はできるのですが、関数 fit によるガウス モデル近似がうまくできません。
Xとzf10の行列はお互い7897×1なのですが下記の方法だと、
エラー: fit>iFit (line 135)
X は 1 列または 2 列の行列でなければなりません。
と表示されます。どのようにしたらうまくできますか。
加えて、Xに対して異なるzf20,zf30,・・・・・とあり、
すべてのzf行列において、ガウス関数のa1,b1,c1,a2,b2,c2,・・・(a は振幅、b は重心 (の位置) であり、c はピーク幅)を保管し、比較したいのですが、プログラム内で一気に計算して、a,b,cの値を保存する方法はありませんか。
初歩的な質問で申し訳ありません。よろしくお願いします。
f=fit(X.',zf10.','gauss1');
plot(f,X,zf10);

採用された回答

Hiroyuki Hishida
Hiroyuki Hishida 2020 年 5 月 13 日
こんばんはです。
(他言語の能力があるないに関わらず)MATLAB初心者のはまりポイントだと思いますので、参考になるであろうコードを添付して、解説します。
[x,y] = titanium;
f1=fit(x.', y.', 'gauss2');
figure(1);
plot(f1,x,y)
X=rand(100,1);
zf10 = rand(100,1);
f2=fit(X, zf10, 'gauss1');
figure(2);
plot(f2, X, zf10);
前半は、デモコードそのままですが、ポイントは1行目と2行目です。
[x,y]はベクトルと言えばベクトルなのですが、大きさは1 x 49となっており1行49列の大きさです。関数fitの引数は、1列もしくは2列である必要がありますので、2行目で転置 ' させています。しかし ' のあとに , をおくと、これまたエラーになりますので、要素ごとの処理をさせるようにして、このエラーを回避しています。
後半は、即興で書いたものになりますが、100行1列の変数を2つ定義しています。この場合は、そのままfit関数にいれることができます。
いかがでしょうか?
菱田
  5 件のコメント
Hiroyuki Hishida
Hiroyuki Hishida 2020 年 5 月 14 日
こんばんは。
最初に、「様」は勘弁してくださいませ。。。
さて、ご質問の内容ですが、fit関数で返されるのはオブジェクト(ここではf1)ですので、「.」を使ってアクセスできます。例えば、f1.a1という具合です。
f1.hogehogeなどとしてみますと、以下のようなメッセージが出力されます。a1以外には、b1、c1などが使えることが確認できます。
名前 'hogehoge' は、係数または問題パラメーターではありません。cfit または sfit の係数と問題パラメーターには、'f.a1' のよう
なドット表記でのみアクセスできます。
現在の近似では次のプロパティにアクセスできます: a1, b1, c1
係数の名前と値は、p1 = f.p1 のように名前で、あるいは names = coeffnames(f) のように関数 coeffnames または関数
coeffvalues を使用して取得できます。
メソッドを使用するには、代わりに plot(f) のような関数表記を使用してください。
いかがでしょうか?
菱田
Takeru Katagiri
Takeru Katagiri 2020 年 5 月 21 日
菱田さん
ご回答ありがとうございます。ならびに返事が遅くなり申し訳ありません。
菱田さんから教えて頂いた方法で、無事目的を達成できました。
本当にありがとうございました。今後ともお助けいただけると幸いです。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeCurve Fitting Toolbox 入門 についてさらに検索

Community Treasure Hunt

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

Start Hunting!