How to access object loaded into a struct when object variable name (as saved) is unknown

28 views (last 30 days)
I have a user-defined class type named classAvengerTrack. The purpose of this is to be a container for radar data on a specific track, so you can imagine that you might have many intances of this class to describe all the tracks in a given radar data set, and that naturally each instance would have a different variable name, such as 'track543'
One of the properties in classAvengerTrack is a table of position reports, with columns such as timestamp, latitude, longitude, etc. So if I wanted to access that table of position reports for a specific track I would use:
track543.positionReports
Simple enough so far.
I want the user to be able to save as specific instance of this object to a .mat file. I want to be able to load that .mat file in another function and act on that postionsReport table. The trouble is, I won't necessarily know the original variable name. For example:
userSavedObject = 'airTrack.mat'
track = load (userSavedObject);
Will load the object into a struct. If I knew that the user saved an instance of the classAvengerTrack object named 'track543' then getting to the positionReports table would be as easy as:
track.track543.positionReports
However, the function loading the .mat file has no prior knowledge of this file, only that it is expected to be an object of type classAvengerTrack.
Question: How do I reference a property of an object that is trapped in struct?
I have tried every variation of indexing I can think of. I either get an error, or I get this:
K>> results(1).positionReports
Reference to non-existent field 'positionReports'.
K>> results(1)
ans =
struct with fields:
ft1AirTruth_Avenger: [1×1 classAvengerTrack]
Any help you can provide to restore my sanity is greatly appreciated. I'm using version R2017a.
  2 Comments
Roger Pierson
Roger Pierson on 8 Dec 2019
I get it, but the scope of the overall project is broader than what I illustrate here for my example. You'll just have to trust me that being able to act on individual tracks as objects is the right approache for my application.
Thanks for the feedback.

Sign in to comment.

Accepted Answer

Stephen
Stephen on 7 Dec 2019
Edited: Stephen on 7 Dec 2019
"I have tried every variation of indexing I can think of..."
Indexing is entirely independent from fieldnames, so indexing like that won't help you.
You can use fieldnames to get the names of the structure fields, and dynamic fieldnames to access them:
S = load(...);
F = fieldnames(S);
X = index of the fieldname in F you want to use
S.(F{X}).positionReports
In the special case that there is only one variable in the .mat file you can do this:
S = load(...);
C = struct2cell(C);
D = C{1};
D.positionReports

More Answers (0)

Community Treasure Hunt

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

Start Hunting!