連番のファイルで欠番がある場合

ワークスペースにある連番の構造体(PLV_001、PLV_003、、、、、、PLV_023)を順に呼び出します。次に、
TFという要素(1000*1*8)を読み出し、squeezeをして(1000*8)、3次元方向にファイルを順に並べるということをしようと思っています。
が、1つ問題があり、連番の構造体には時々欠番があります。上記でいうと、PLV_002がありません。するとエラーが出ます
これをスルーする方法はあるでしょうか。ご教授ください。
*******
clear
clc
nfile = 19; % number of filels
plv = [];
load PLV.mat %PLV.matに構造体が保存されている。
for cnt=1:nfile
dname = sprintf('PLV_00%d',cnt);
data = strcat(dname,'.TF');
file = eval(data);
file2 = squeeze(file);
plv = cat(3,plv,file2);
end

 Accepted Answer

Kazuya
Kazuya on 28 Dec 2018

0 votes

  1. exist 関数でその変数が存在するかどうかのチェック
  2. ワークスペースに存在する変数を who 関数でリストする
の2通り思いつきました。1 の方が、確実かな・・?試してみてください。
例1:
clear
clc
nfile = 19; % number of filels
plv = [];
load PLV.mat %PLV.matに構造体が保存されている。
for cnt=1:nfile
dname = sprintf('PLV_00%d',cnt);
if exist(dname,'var') % 'var' で変数の有無だけをチェック
data = strcat(dname,'.TF');
file = eval(data);
file2 = squeeze(file);
plv = cat(3,plv,file2);
end
end
例2:
clear
clc
nfile = 19; % number of filels
plv = [];
load PLV.mat %PLV.matに構造体が保存されている。
varlists = who('PLV*') % 変数リストをセル配列で取得
for cnt=1:length(varlists)
dname = varlists{cnt};
data = strcat(dname,'.TF');
file = eval(data);
file2 = squeeze(file);
plv = cat(3,plv,file2);
end

3 Comments

Jun
Jun on 28 Dec 2018
ありがとうございます。
PLV_002のファイルがなくてもうまくいきました。
「1、exist 関数でその変数が存在するかどうかのチェック」だけで、なぜエラーが回避されるのでしょうか。
あと、dname = sprintf('PLV_00%d',cnt); のところですが、ファイル名が悪いのですが、当方のファイル名には 001~023 までの番号がついていて、今のままでは009までしか読み込めません。
010~023も読み込めるようにするにはどうしたらよいでしょうか。
お手数をおかけしますが、お教えください。
Jun
Jun on 28 Dec 2018
例2のほうですべて解決しました。
ありがとうございました。
Kazuya
Kazuya on 28 Dec 2018
dname = sprintf('PLV_00%d',cnt);
で 0 が 2つ存在するファイル名になっているのが原因ですね。 cnt = 10 の時、変数名 PLV_0010 を探す処理になっています。

Sign in to comment.

More Answers (0)

Asked:

Jun
on 28 Dec 2018

Commented:

on 28 Dec 2018

Community Treasure Hunt

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

Start Hunting!