【初歩的質問】トライ​アル版の関数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);

 Réponse acceptée

Hiroyuki Hishida
Hiroyuki Hishida le 13 Mai 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 commentaires

Takeru Katagiri
Takeru Katagiri le 14 Mai 2020
菱田様
ご回答ありがとうございます。
無事解決できました。
菱田様のような、初心者にも回答してくださる親切なお方がいらっしゃるおかげで、MATLABの活動を継続することができます。今後ともお助けいただけると大変うれしいです。
本当にありがとうございました。
Hiroyuki Hishida
Hiroyuki Hishida le 14 Mai 2020
若干こそばゆいですが、ありがとうございます。
(そこまで謙遜されなくても良いですよ)
菱田
Takeru Katagiri
Takeru Katagiri le 14 Mai 2020
Modifié(e) : Takeru Katagiri le 14 Mai 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を作りたいです。
大変お手数ですがご回答いただけると助かります。
よろしくお願いします。
Hiroyuki Hishida
Hiroyuki Hishida le 14 Mai 2020
こんばんは。
最初に、「様」は勘弁してくださいませ。。。
さて、ご質問の内容ですが、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 le 21 Mai 2020
菱田さん
ご回答ありがとうございます。ならびに返事が遅くなり申し訳ありません。
菱田さんから教えて頂いた方法で、無事目的を達成できました。
本当にありがとうございました。今後ともお助けいただけると幸いです。

Connectez-vous pour commenter.

Plus de réponses (0)

Community Treasure Hunt

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

Start Hunting!