ワークスペース上の構​造体の中のデータを、​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という
文字だけになります。(当然だとおっしゃる方もいらっしゃると思います。)
どのようにしたら、時系列データを読み込むことができるのでしょうか?
コマンドをご存知の方があれば教えてください。

 Réponse acceptée

Shunichi Kusano
Shunichi Kusano le 17 Avr 2019

3 votes

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

8 commentaires

Hideaki Ishii
Hideaki Ishii le 17 Avr 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 le 17 Avr 2019
お役に立ててこちらとしてもうれしいです。
>001 ~140 までの数字の一桁、二桁、三桁で場合分け
簡単に書く方法もありまして、
for i = 1:140
varname = sprintf('Signal_%03d', i);
% この後に構造体配列からデータを新しい配列に格納する処理を書く
end
という書き方があります。"%03d"は,「0詰め3桁の整数を出力」、という意味になります。
Hideaki Ishii
Hideaki Ishii le 17 Avr 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 le 17 Avr 2019
for i = 0:139
とすれば大丈夫です!
Hideaki Ishii
Hideaki Ishii le 17 Avr 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 le 17 Avr 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 le 17 Avr 2019
ちょうど同時の投稿になってしまいましたね。解決出来たようでよかったです。
Hideaki Ishii
Hideaki Ishii le 17 Avr 2019
誠にありがとうございました。周りに聞いても、解決策がなくここで質問して回答なければ、非常にどろくさいやり方をするところでした。
やっぱりマトラブすごいです。140chのデータがたくさん投げられてくるので、その備えをしていましたが、取り掛かりがスムーズになりました。ありがとうございました。

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur データ型の変換 dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!