ある試験結果の行列A​のデータを列ごとに読​み取って計算し、読み​取った列の成分数を返​し、次の列、次の列へ​と読み込ませる方法

ある試験を行って得た試験結果A=7000×70 double(この試験結果の行と列の数は試験ごとに変わるので、できれば判別してデータを取ってくるプログラムを組みたいです)だったとします。
この時1列ごと(A(1:7000,1)、A(1:7000,2)・・・A(1:7000,70))にある計算のプログラムを通して、その列ごとでプログラムを通したあとの結果を求め最終的にAの列ごとにプログラムを通した結果B(7000×70)の行列を求めたいです。
実際に繰り返し行いたい部分を下記に示させていただきます。
E1=A(1:7000,1);%試験結果Aの1列を抽出%
Ey1 = polyfit(X,E1,3);%3次式の近似式の各係数行列Ey1を導出(以降は行いたい計算過程)%
Eyy1=Ey1(1,4);%p行列の最後の切片要素を取り出す%
Eyyy1=Eyy1+1;%切片に+1を加える%
Eyyyy1=[Ey1(1,1) Ey1(1,2) Ey1(1,3) Eyyy1];%pの係数行列から切片に+1加えた新しい係数行列Eyyyy1を作る%
EY1 = polyval(Eyyyy1,X);%Eyyyy1行列を使ってXに対する近似式EY1を導出%
REY1=E1./EY1;%実際の試験結果E1を近似式EY1で成分ごとに割る(自分が欲しいプログラムを通した結果Bの1列目)%
上記の流れを繰り返し試験結果Aの列の数、計算を繰り返し行い、最終的には行列の成分の数が元の試験結果と同じ数求まるプログラムを組みたいです。
よい方法をご存じの方がいましたらぜひ教えていただけないでしょうか。
よろしくお願いします。

8 Comments

Kenta
Kenta on 6 Feb 2020
こんにちは、「この試験結果の行と列の数は試験ごとに変わるので、できれば判別してデータを取ってくるプログラムを組みたいです」というところは
[h w]=size(A);
で解決しそうです。今回の例でいう、h,wにはそれぞれ7000、70の値が入ります。
そのあとの繰り返しは、
for i=1:w
%行いたい計算
E1=A(1:h,i);%試験結果Aのi列を抽出%
Ey1 = polyfit(X,E1,3);%3次式の近似式の各係数行列Ey1を導出(以降は行いたい計算過程)%
Eyy1=Ey1(1,4);%p行列の最後の切片要素を取り出す%
Eyyy1=Eyy1+1;%切片に+1を加える%
Eyyyy1=[Ey1(1,1) Ey1(1,2) Ey1(1,3) Eyyy1];%pの係数行列から切片に+1加えた新しい係数行列Eyyyy1を作る%
EY1 = polyval(Eyyyy1,X);%Eyyyy1行列を使ってXに対する近似式EY1を導出%
REY1=E1./EY1;%実際の試験結果E1を近似式EY1で成分ごとに割る(自分が欲しいプログラムを通した結果Bの1列目)%
end
とすればよく、もし、提示いただいたコードが正しいのであれば、Xをうまく定義すれば動くと思います。ひとまずおおまかな流れはこのようなかんじと思います。
Takeru Katagiri
Takeru Katagiri on 6 Feb 2020
Kenta様 ご回答ありがとうございます。 大変参考になります。 教えていただいた通りにやってみます。 ありがとうございます。
Kenta
Kenta on 6 Feb 2020
はい、また問題あれば返信ください。ダミーデータ(1,2,3、、、、と規則的な数字が入っている)などを作成いただけると一緒に考えれるかもしれません。
Takeru Katagiri
Takeru Katagiri on 7 Feb 2020
Kenta様
実際に試して見ました。再度伺いたいことがあり、ご連絡させていただきました。
試験結果Aが7000×70、より簡単なforループないの計算で下記を実行しました。
するとA行列の1列目を計算したもの:REY1は返って来たのですが、これをさらに自動でREY2・・・・REY70まで求めさせるためにはどのようにしたらよいのでしょうか。
大変お手数ですがご回答お願いします。
[h w]=size(A);
for i=1:w;
%行いたい計算
E1=A(1:h,i);%試験結果Aのi列を抽出%
Ey1 = polyfit(X,Eyoko1,6);%6次式の近似式の各係数行列Ey1を導出(以降は行いたい計算過程)%
REY1 = polyval(Ey1,X);%Ey1行列を使ってXに対する近似式EY1を導出%
end
Kenta
Kenta on 7 Feb 2020
[h w]=size(A);
RE=zeros(h,w);
for i=1:w;
%行いたい計算
E1=A(1:h,i);%試験結果Aのi列を抽出%
Ey1 = polyfit(X,Eyoko1,6);%6次式の近似式の各係数行列Ey1を導出(以降は行いたい計算過程)%
REY1 = polyval(Ey1,X);%Ey1行列を使ってXに対する近似式EY1を導出%
RE(:,w)=REY1;
end
こんにちは、このように、結果と同じ形式の変数REを用意しておいて、各ループの終わりのところで代入していけばよいと思います。最終的には7000 by 70の結果(RE)が得られるはずです。
最終結果が7000 by 70でなければ、適宜変更をお願いいたします。
たびたび申し訳ありません。
今回修正していただいた方法を試したところ、最後に導出される
REが(7000,1:69)までが0の行列で(7000,70)の最後の列だけが、今まで導出できていた(先ほどのプログラム)、
[h w]=size(A);
%行いたい計算
E1=A(1:h,i);%試験結果Aのi列を抽出%
Ey1 = polyfit(X,Eyoko1,6);%6次式の近似式の各係数行列Ey1を導出(以降は行いたい計算過程)%
REY1 = polyval(Ey1,X);%Ey1行列を使ってXに対する近似式EY1を導出%
REY1と同じ計算結果が示されました。
どのように修正を加えれば、列ごとに7000x70の要素を計算させることができますか。
大変お手数なのは承知ですが、何卒よろしくお願いします。
Kenta
Kenta on 7 Feb 2020
RE(:,i)
大変失礼しました。少なくともうえのようにすべきでした。
wではなくiが入っています。これで少し改善されましたか?
自分がプログラムの勉強が足らず、読めないばかりにすいません。
endの上の行を変えました。
すると、REは7000×70の行列にはなるのですが、7000,70列目の結果が1から69列までコピーされたREが出てきました。
まだお付き合いいただけますでしょうか?
[h w]=size(A);
RE=zeros(h,w);
for i=1:w;
%行いたい計算
E1=A(1:h,i);%試験結果Aのi列を抽出%
Ey1 = polyfit(X,Eyoko1,6);%6次式の近似式の各係数行列Ey1を導出(以降は行いたい計算過程)%
REY1 = polyval(Ey1,X);%Ey1行列を使ってXに対する近似式EY1を導出%
RE(:,i)=REY1;
end 

Sign in to comment.

 Accepted Answer

Kenta
Kenta on 8 Feb 2020

0 votes

example.jpg
こんにちは、説明不足だったようで、失礼いたしました。
sinカーブベースの関数の6次のpolyfitで近似する例を作成してみました。
Katagiriさまも同様に、生データをフィッテイングして、それのフィッテイング結果を表示させたいものと推察しました。
下のコードをベースに書き換えると良いと思います。
clear;clc;close all
% ダミーデータの作成
A=linspace(-10, 10,7000);
A=repmat(A',[1 70]);
a1=randi(100,[70 1]);
a2=randi(5,[70 1]);
X=a1.*sin(A')+a2;
figure;plot(A',X(1,:))
hold on
[h w]=size(X);
RE=zeros(h,w);
for i=1:h
%行いたい計算
E1=A(1:end,i);%試験結果Aのi列を抽出%
Ey1 = polyfit(E1',X(i,1:end),6);%6次式の近似式の各係数行列Ey1を導出(以降は行いたい計算過程)%
%%ここのEyokoはE1では??
REY1 = polyval(Ey1,A(1:end,i));%Ey1行列を使ってXに対する近似式EY1を導出%
%%得られた係数Ey1を用いて、データXに関する予測点を計算
%%i番目に関して、再構成した点を変数REに記録する
RE(i,:)=REY1;
end
plot(A',RE(1,:),'b')
legend('予測した値','元の値')
I=getframe(gcf);
imwrite(I.cdata,'example.jpg')

4 Comments

Takeru Katagiri
Takeru Katagiri on 8 Feb 2020
土曜日なのに回答いただいてありがとうございます。
自分は7000×70あるデータの列ごとに近似式を求め、最終的には70本の近似値をプロットさせることを目標にしております。
ただいま、Kenta様のプログラムを勉強し、行っている内容を理解しました。
大まかな流れをつかむことができたため、細かいところを修正していきます。
なんとか完成させるべく頑張りますので、またご助言いただけたらと思います。
Kenta
Kenta on 8 Feb 2020
ご返信ありがとうございます。私のコード案を深く見ていただいているようで、光栄に思います。
「7000×70あるデータの列ごとに近似式を求め、最終的には70本の近似値をプロットさせることを目標にしております」とありますが、おおよそこちらの理解が正しかったようでよかったです。
転置を複数使っていたり、直感的にYである変数名がXになっていたりと、少々理解しずらいところがあるかと思います。また、そちらの課題にうまく適合するよう、適宜調整をいただけると幸いです。一見簡単に見えても、ところどころつまずくところがあるかもしれません。また問題あれば、ご返信ください。宜しくお願い致します。
Takeru Katagiri
Takeru Katagiri on 14 Feb 2020
Kenta様
このたびはご回答ありがとうございました。
1週間かかってしまいましたが、すべてを理解し自分でfor文を組めるようになりました。
また、目的の計算プログラムのフィッティングもできました。
Kenta様のご指導のおかげでまた一つMATLABを使えるようになりました。
またご回答をいただけたら大変助かります。
本当にありがとうございました。
Kenta
Kenta on 14 Feb 2020
こんにちは、ご返信ありがとうございます。丁寧にご確認いただいたようでうれしいです。
こちら、解決し、良かったです。はい、またよろしくお願いいたします。

Sign in to comment.

More Answers (0)

Categories

Find more on MATLAB in Help Center and File Exchange

Tags

Asked:

on 5 Feb 2020

Commented:

on 14 Feb 2020

Community Treasure Hunt

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

Start Hunting!