How to use the fields in the structure?
3 views (last 30 days)
Show older comments
Praveen Kumar Pakkirisamy
on 28 Feb 2019
Commented: Praveen Kumar Pakkirisamy
on 28 Feb 2019
My structure has 83 Fields, and each field has 1059 *3 Double. Firstly how do I access these fields from the structure and then how do I multiply a matrix(rotation matrix) on these fields?. I know that I have to use for loop to access all the values and I have found this code But I do not know how It does function.
for i = fieldnames(markerStruct)'
newMarkerStruct.(i{1}) = markerStruct.(i{1});
end
I understand that values from markerStruct gets copied to newmarkerStruct. But I don't understand what i{1} means and How the value is getting assigned.
0 Comments
Accepted Answer
Adam Danz
on 28 Feb 2019
Edited: Adam Danz
on 28 Feb 2019
I've responded to your quesitons below. First I make some fake data to work with.
% Fake data
S.f1 = rand(1059, 3);
S.f2 = rand(1059, 3);
S.f3 = rand(1059, 3);
"Firstly how do I access these fields from the structure?"
% Field f1 is accessed like this
S.f1
% or dynamically
fn = fieldnames(S); %list of field names
S.(fn{1})
% add a field
S.f4 = rand(1059, 3);
"How do I multiply a matrix(rotation matrix) on these fields?"
% rotation matrix
ry = [ cos(pi) 0 sin(pi);
0 1 0 ;
-sin(pi) 0 cos(pi)] ;
% Multiply the matrix by the first field .
f1Rot = S.f1 * ry;
"I know that I have to use for loop to access all the values "
% Actually, not true. You can use structfun() to apply a function to all fields.
% In this example, it's expected that all fields have 3 columns of data.
S2 = structfun(@(x) x * ry, S, 'UniformOutput', false);
% But if you must use a loop
fn = fieldnames(S); %list of field names
S2 = struct; % create new structure (no fields yet)
for i = 1:length(fn)
S2.(fn{i}) = S.(fn{i}) * ry; %store results in a new struct with same field names
end
"I have found this code But I do not know how It does function"
% This for-loop does nothing. It's just looping through each field and re-assigning the identical value.
% It's like A = A.
for i = fieldnames(markerStruct)'
newMarkerStruct.(i{1}) = markerStruct.(i{1});
end
fieldnames() lists all field names in a cell array of strings.
6 Comments
Adam Danz
on 28 Feb 2019
Edited: Adam Danz
on 28 Feb 2019
Yeah, to be honest, this is my first time seeing it.
If you're going to use a loop (rather than structfun, which I showed in my examples), then this is the better approach:
fn = fieldnames(S); %list of field names
for i = 1:length(fn)
S.(fn{i}) * ry
end
More Answers (0)
See Also
Categories
Find more on Data Type Conversion in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!