How to load in variable if it is present in a matfile?
5 ビュー (過去 30 日間)
古いコメントを表示
I am having trouble with "conditional" loading of a variable from a matfile, depending on whether the matfile contains the variable. Here is what I am trying to do:
- Go through many different (large) matfiles, some of which contain mountain height in a variable called topo, and some of which contain mountain height in variable called elevation.
- If the matfile contains the variable topo, load that into a workspace variable called mountainHeight. If the matfile contains the variable elevation, load that into a workspace variable called mountainHeight. If neither variable is contained in matfile, do nothing.
- Avoid crashing the load command by trying to load variables which are not in the matfile.
Here is what I have tried (R2015a), but I'd bet there is a better/shorter way.
filename = 'topography.mat'; % A matfile that comes with matlab
m = matfile(filename); % Make a matfile object
FileInfo = whos(m); % Structure containing information about matfile including variables it contains
for iVar = 1:length(FileInfo)
if strcmp(FileInfo(iVar).name, 'topo') % Check if topo is a variable in topography.mat
mountainHeight = m.topo; % Load topo
elseif strcmp(FileInfo(iVar).name, 'elevation') % Check if elevation is a variable in topography.mat
mountainHeight = m.elevation; % Load elevation
end
end
0 件のコメント
採用された回答
Steven Lord
2015 年 7 月 21 日
D = load('mymatfile.mat');
if isfield(D, 'elevation')
elevation = D.elevation;
else
elevation = NaN;
end
Alternately, check if the field exists and if it doesn't, add it with some placeholder data.
D = load('mymatfile.mat');
if ~isfield(D, 'elevation')
D.elevation = NaN;
end
If you want to do this with multiple fields, use dynamic field names.
D = load('mymatfile.mat');
listOfFields = {'elevation', 'material', 'price'};
isPresent = isfield(D, listOfFields);
for fieldnum = 1:length(listOfFields)
if ~isPresent(fieldnum)
F = listOfFields{fieldnum};
D.(F) = NaN;
end
end
7 件のコメント
Cedric
2015 年 7 月 23 日
編集済み: Cedric
2015 年 7 月 23 日
Then just build a small function that does what Steven proposes, and outputs mountainHeight:
function mountainHeight = loadMountainHeight( locator )
data = load( locator ) ;
if isfield( data, 'topo' )
mountainHeight = data.topo ;
elseif isfield( data, 'elevation' )
mountainHeight = data.elevation ;
else
mountainHeight = [] ; % Or NaN or whatever you want, to tell
% the caller "field not found".
end
end
Then in your main script, you do something like the following:
dir_mat = dir( '*.mat' ) ;
for fId = 1 : numel( dir_mat )
mountainHeight = loadMountainHeight( dir_mat(fId).name ) ;
if isempty( mountainHeight )
% Throw warning, or print message, or just skip.
warning( 'File "%s" : no valid field found!', dir_mat(fId).name ) ;
continue ;
end
fprintf( 'File "%s" : processing height..\n', dir_mat(fId).name ) ;
% .. code for further processing mountainHeight ..
end
その他の回答 (2 件)
Sean de Wolski
2015 年 7 月 21 日
編集済み: Sean de Wolski
2015 年 7 月 23 日
Use this to determine what's in the MAT file, then use the MAT File class to load that variable in.
参考
カテゴリ
Help Center および File Exchange で Structures についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!