How to use genvarname variable after creation?

6 views (last 30 days)
Lior Magen
Lior Magen on 13 Dec 2021
Edited: Stephen23 on 17 Dec 2021
let's take an ex. from here:
"Example 2
Read a column header hdr from worksheet trial2 in Excel® spreadsheet myproj_apr23:
[data hdr] = xlsread('myproj_apr23.xls', 'trial2');
Make a variable name from the text of the column header that will not conflict with other names:
v = genvarname(['Column ' hdr{1,3}]);
Assign data taken from the spreadsheet to the variable in the MATLAB workspace:
eval([v '= data(1:7, 3);']);"
How do I use the variable that is created?
  1 Comment
Stephen23
Stephen23 on 14 Dec 2021
"How do I use the variable that is created?"
By using more slow, complex, inefficient code just like the code that you used to create that variable.
Is there a particular reason why you cannot use simpler and more efficient code (e.g. indexing, tables)?

Sign in to comment.

Accepted Answer

Rik
Rik on 14 Dec 2021
This is a terrible idea. You are forced to use eval every time.
The only time you wouldn't need eval is if you are using it to access fields of a struct. I would say that is the primary use case of this function.
  3 Comments
Steven Lord
Steven Lord on 17 Dec 2021
Storing the data from that sample table I created in a struct would require deciding which type of access to the data you're going to do more often and so want to make easier.
r = randperm(5).';
hocusPocus = r.^2;
% Scalar struct with array fields
s1 = struct('r', r, 'hocusPocus', hocusPocus);
% Or array of structs with scalar fields
s2 = struct('r', num2cell(r), 'hocusPocus', num2cell(hocusPocus));
It's easy to retrieve all the elements of one of the fields using s1 but more difficult to get a specific element from both r and hocusPocus.
allOfR = s1.r
allOfR = 5×1
3 5 1 4 2
secondElements.r = s1.r(2);
secondElements.hocusPocus = s1.hocusPocus(2)
secondElements = struct with fields:
r: 5 hocusPocus: 25
It's harder to get all of the elements of one of the fields using s2 but it's easier to get a specific element from both r and hocusPocus. The first one looks easy but that's because I took advantage of my knowledge that r contains scalars and so can be concatenated into a column vector. In the general case this is trickier.
allOfR = vertcat(s2.r)
allOfR = 5×1
3 5 1 4 2
secondElements = s2(2)
secondElements = struct with fields:
r: 5 hocusPocus: 25
In a table array, you can slice across rows or down variables basically equally easily.
t = table(r, hocusPocus);
allOfR = t.r % or
allOfR = 5×1
3 5 1 4 2
allOfR = t(:, 'r') % or t(:, 2)
allOfR = 5×1 table
r _ 3 5 1 4 2
secondElements = t(2, :)
secondElements = 1×2 table
r hocusPocus _ __________ 5 25

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by