ワークスペース上の構​造体の中のデータを、​strcatコマンド​で作った文字列で指示​した、名称のデータを​読み込ませたい。

<問合せ事項>
ワークスペース上の構造体の中のデータを、読み込みたい。構造体のデータが規則性のある名称でたくさんあるので
構造体の名称をstrcatを用いて、文字をFor文で自動的に作って、読み込ませたいが、データを読み込まない。
<背景>
計測器で測定したデータをマトラブで解析する必要があり、matファイルに変換してもらいました。
チャンネル数が100を超えるので計測器のセンサ―情報等もあるためか、matファイルをmatlabで読み込むと構造体の階層データで
格納されていました。具体的にはSignal_001,Signal_002, ,,, Signal_100の構造体データがあります。
解析に必要な時系列のデータは、この構造体のSignal_001.y_values.valuesに格納されています。
例えば、y=Signal_001.y_values.values;のように直接打ち込むと変数yのデータとして時系列データを読み込んでくれます。
<困りごと>
データ数が多いので、各Signal_001~Signal_100に格納された時系列データを連続して読み込み、時系列データだけの
マトリックスを作りたいのです。
データ名称自体に規則性があるので、文字列をFor文で001~100まで作ります。(ここでは省略します)
例えば、s1='Signal_';s2='001';s3='.y_values.values' s=strcat(s1,s2,s3)
こうすることでs1=Signal_001.y_values.valuesというように格納された名称名までは認識をするのですが、
これをA=s1;として、Aに時系列データが入ってほしいのですが、AのデータはSignal_001.y_values.valuesという
文字だけになります。(当然だとおっしゃる方もいらっしゃると思います。)
どのようにしたら、時系列データを読み込むことができるのでしょうか?
コマンドをご存知の方があれば教えてください。

 Akzeptierte Antwort

Shunichi Kusano
Shunichi Kusano am 17 Apr. 2019

3 Stimmen

matファイルの中身に複数の構造体が入っているとのことですので、matファイル読み込みの際に
Signals = load('***.mat');
のように読み込むと、全てを含んだ構造体配列が一つできます。
構造体配列の各フィールドには文字列形式でのアクセスが可能です。
Signals.('Signal_001').y_values.values % これでアクセスできる
あとは文字列部分をforループで回せば、データ部分だけ取り出せると思います。
こちらで簡単にテストした感じではできそうでしたが、いかがでしょうか。

8 Kommentare

Hideaki Ishii
Hideaki Ishii am 17 Apr. 2019
素早い回答誠にありがとうございます。この教えていただいた表記だとうまくいくので
Signals.('Signal_001').y_values.values
簡単にSignal_001~Signal009までとして
for k=1:9
s1='Signal_00';
chr=num2str(k);
s=strcat(s1,chr);
A(k,:)=Signals.(s).y_values.values;
end
これでAに9個分格納できました。すごいです。
あとは、001 ~140 までの数字の一桁、二桁、三桁で場合分けしたら、なんとか140ch分のデータが
そろってくるので、解析の手間が省けそうです。
ありがとうございました。
Shunichi Kusano
Shunichi Kusano am 17 Apr. 2019
お役に立ててこちらとしてもうれしいです。
>001 ~140 までの数字の一桁、二桁、三桁で場合分け
簡単に書く方法もありまして、
for i = 1:140
varname = sprintf('Signal_%03d', i);
% この後に構造体配列からデータを新しい配列に格納する処理を書く
end
という書き方があります。"%03d"は,「0詰め3桁の整数を出力」、という意味になります。
Hideaki Ishii
Hideaki Ishii am 17 Apr. 2019
誠に、誠にありがとうございます。
一応if elseif で場合分けして、読み込めたのですが、
上記コマンドを使うと、非常に簡単ですね。
もう一点教えてください。
実はデータ名称が計測器の特性で0から始まっていまして、Signal_000 ~Signal_139
なのです。if文ではうまくいったのですが、i を 140 とするとSignal_139までしかないので
存在しないフィールドSignal_140’を参照していますと出て、139個文のデータしか読み込めません。
Signal_000 を読み込んでいません。もう一息なんですが、ここまで来たら、簡易な分で記載したいのですが、教えていただけないでしょうか?
for i = 1:140
varname = sprintf('Signal_%03d', i);
A(i,:) = Signal.(vername).y_values.values;
% この後に構造体配列からデータを新しい配列に格納する処理を書く
end
ご無理申し上げます。よろしくお願いいたします。
Shunichi Kusano
Shunichi Kusano am 17 Apr. 2019
for i = 0:139
とすれば大丈夫です!
Hideaki Ishii
Hideaki Ishii am 17 Apr. 2019
すいません。わかりました。
下記のように、i-1と記載して0番目から指定してあげればいいのですね。
for i = 1:140
varname = sprintf('Signal_%03d', i-1);
A(i,:) = Signal.(vername).y_values.values;
% この後に構造体配列からデータを新しい配列に格納する処理を書く
end
おかげさまで、140個分のデータ解析用の準備が簡易になりました。
Shunichi Kusano
Shunichi Kusano am 17 Apr. 2019
あ、上の書き方だと、書き込めないんですね。すみません。でしたら
for i = 1:140
varname = sprintf('Signal_%03d', i-1);
A(i,:) = Signal.(vername).y_values.values;
end
これで大丈夫かと思います。varnameに入れるときだけマイナス1しています。
Shunichi Kusano
Shunichi Kusano am 17 Apr. 2019
ちょうど同時の投稿になってしまいましたね。解決出来たようでよかったです。
Hideaki Ishii
Hideaki Ishii am 17 Apr. 2019
誠にありがとうございました。周りに聞いても、解決策がなくここで質問して回答なければ、非常にどろくさいやり方をするところでした。
やっぱりマトラブすごいです。140chのデータがたくさん投げられてくるので、その備えをしていましたが、取り掛かりがスムーズになりました。ありがとうございました。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu データ型の変換 finden Sie in Hilfe-Center und File Exchange

Community Treasure Hunt

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

Start Hunting!