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

上記の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);

 Accepted Answer

Hiroyuki Hishida
Hiroyuki Hishida on 13 May 2020

2 votes

こんばんはです。
(他言語の能力があるないに関わらず)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 Comments

Takeru Katagiri
Takeru Katagiri on 14 May 2020
菱田様
ご回答ありがとうございます。
無事解決できました。
菱田様のような、初心者にも回答してくださる親切なお方がいらっしゃるおかげで、MATLABの活動を継続することができます。今後ともお助けいただけると大変うれしいです。
本当にありがとうございました。
Hiroyuki Hishida
Hiroyuki Hishida on 14 May 2020
若干こそばゆいですが、ありがとうございます。
(そこまで謙遜されなくても良いですよ)
菱田
Takeru Katagiri
Takeru Katagiri on 14 May 2020
Edited: Takeru Katagiri on 14 May 2020
菱田様
もしよろしければ、加えて質問させていただけませんか。
関数fitを用いる(f1=fit(X, zf10, 'gauss1');)と、
ワークスペースに名前がf1のcfitができて、そのなかを開くと、指数近似式のa1,b1,c1の値が示されています。
このa,b,cの値を自動でdoubleとして別の箱に収めることはできませんか?
最終的に行いたいのは、あるXが100×1でZが100×10の行列があり、
Zを1列づつ取り出し(Z1、Z2、Z3・・・Z10)、XとZ1の値から関数fitで指数近似式のa1,b1,c1を求め、doubleとして保存し、Z1からZ10までのa,b,c値が示された(3×10)か(10×3)のdoubleを作りたいです。
大変お手数ですがご回答いただけると助かります。
よろしくお願いします。
こんばんは。
最初に、「様」は勘弁してくださいませ。。。
さて、ご質問の内容ですが、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 on 21 May 2020
菱田さん
ご回答ありがとうございます。ならびに返事が遅くなり申し訳ありません。
菱田さんから教えて頂いた方法で、無事目的を達成できました。
本当にありがとうございました。今後ともお助けいただけると幸いです。

Sign in to comment.

More Answers (0)

Categories

Community Treasure Hunt

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

Start Hunting!