load structure array with a function and extract the variables

86 ビュー (過去 30 日間)
Sophie Füchtner
Sophie Füchtner 2017 年 5 月 18 日
編集済み: Csaba 2018 年 2 月 3 日
Hi,
I am trying to write a function that will load a generic file that is a structure array. Then I want to extract the variables (and perform some operations on them).
The problem is that i cannot extract them, because, I need to call the function with 'filename.mat', but when I then want to extract the variables, it does of course not work, because the name of the variable contains .mat, instead of only 'filename' - which i could use as the structure.
The array does have a variable called 'name', its value being the file name w/o the .mat extension.
My idea was to extract this value and turn it into a variable, but I cannot access it:
- with load(filename,'name') i get 'filename.mat' - and not 'filename'...
- and with filename = load(filename,'name') i get an empty structure array??
I hope I expressed myself clearly enough and that somebody can tell me what is wrong??
see the example:
- function [cube] = img(filename)
- load(filename)
- filename=load(filename, 'name')
- cube = filename.data;
- end
The warnings and error i get are:
_________________________________________________________________
Warning: Error occurred while trying to call loadobj on a dataset object: Reference to non-existent field 'props'. > In img at 7 Warning: Class 'dataset' is an unknown object class or does not have a valid 'loadobj' method. Object 'Norway_spruce_not_extracted_RA_ray' of this class has been converted to a structure. > In img at 7 Warning: Variable 'name' not found. > In img at 9 Reference to non-existent field 'data'.
Error in img (line 11) cube = filename.data;
___________________________________________________________
I really do not understand what is going on...??
Thank you in advance! Sophie
  3 件のコメント
Stephen23
Stephen23 2017 年 5 月 22 日
@Sophie Füchtner: the section "Alternative: load into a Structure, not into the Workspace" is relevant to your situation.
Also you should note that it explained that it is much simpler to save and load data in a loop when the variable name does not change. This includes the variable names inside .mat files. Most likely your code could be significantly simplified by not saving lots of different variable names, but by simply doing something like this:
test_case = 'spruce'
test_data = [...]
save('test1.mat','test_case','test_data')
and then simply
S = load('test1.mat');
S.test_data
S.test_case
etc
You will note that this is then trivial to do in a loop.

サインインしてコメントする。

採用された回答

Guillaume
Guillaume 2017 年 5 月 18 日
I did not understand exactly what you're trying to do. It sounds like you are trying to name your variables depending on the file that you load, which is never a good idea.
However, I can certainly explain the error message. The mat file that you are trying to load a file that contains a variable of type dataset. The version of matlab that you are using does not know what a dataset is. It's because either you're missing the required toolbox (e.g. there's a dataset type in the statistics and machine learning toolbox) or because it's a custom type for which you're missing the m file (in which case you need to ask whoever saved that mat file for the required m files).
In any case, without the required toolbox or necessary m file, you will not be able to load that mat file properly. You may be able to load part of the file using matfile but you'll always be missing the dataset.
  9 件のコメント
Sophie Füchtner
Sophie Füchtner 2017 年 5 月 22 日
I will try again and let you know if I succeed (since - as you might guess - I am new to matlab, this is quite complicated for me^^)
for now, thank you alot Stephen and Guillaume :)

サインインしてコメントする。

その他の回答 (2 件)

Sophie Füchtner
Sophie Füchtner 2017 年 5 月 24 日
Hi,
just to let you know, I decided to just load the file and rename the structure by hand into a generic name, after which my scripts can be applied to that. It is not as "perfect" as I wanted it to be, but it works and I can move on :)
Thank you for your time. Best, Sophie

Csaba
Csaba 2018 年 1 月 27 日
編集済み: Stephen23 2018 年 1 月 28 日
I had a similar problem. Here is a solution (maybe not the best one):
filename='*'; % you get it from somewhere
[path,name,ext] = fileparts(filename);
a=load(filename);
my_good_structure=a.(name);
and here you go.
  2 件のコメント
Csaba
Csaba 2018 年 2 月 3 日
Stephen Cobeldick : Not exactly. He suggested :
matcontent = load('somefile.mat');
name = 'varname'; %varname is the name of a variable in the matfile
varcontent = matcontent.(name); %get the content of the variable.
If you compare, it is not exactly the same.
matcontent.(name)
would not exist.
matcontent.(somefile).name
might exist if any.
My solution is getting the whole structure and you should not know in advance - before loading the file - any 'varname'.

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!

Translated by