MATLAB Answers

Jim Riggs
0

What is the best way to insure that all of my functions are using the same constant values?

Asked by Jim Riggs
on 17 Sep 2019 at 20:19
Latest activity Edited by Jim Riggs
on 29 Sep 2019 at 0:08
I want to make sure that my functions are all using the same values for physical constants, like earth radius, elipsoidal flattening, etc. and avoid hard-coding a bunch of constant values in each function.
Some people advocate using a function that returns constant values, e.g.
Re = LibraryConstant('Earth_Radius');
f = LibraryConstant('Ellipsoid_flattening');
ev = LibraryConstant('electron_volt');
...
The function "LibraryConstant" is a big case-select structure that returns the requested value.
Or, you might define a bunch of global constants, but this seems like an undesirable approach.
What about creating a structure or table that contains all of the constants - this would have to be passed as an additinal argumernt to each function.
What would you recommend as an efficient method?

  1 Comment

Two very good suggestions.
Thanks to @James Tursa and @Steven Lord

Sign in to comment.

2 Answers

Answer by Steven Lord
on 17 Sep 2019 at 21:10
 Accepted Answer

classdef myconstants
properties(Constant)
g = 9.8;
g_units = 'm/s/s';
c = 299792458;
c_units = 'm/s';
end
end
This is similar to James Tursa's struct based approach, but with one major difference: you don't need to call a function to create the struct in your workspace. You just reference the property with the name.
>> x = myconstants.c
x =
299792458
You can even give your properties help text. [This is documented in the documentation for the help function.]
classdef myconstants
properties(Constant)
% g is the gravity of Earth
% (https://en.wikipedia.org/wiki/Gravity_of_Earth)
g = 9.8;
g_units = 'm/s/s';
% c is the speed of light in a vacuum
c = 299792458;
c_units = 'm/s';
end
end
>> help myconstants.g

  6 Comments

Ah, I suspect you're using a release that predates the ability to define string arrays using double-quotes.
Ah yes. I have run into that issue before here in the forum.
In addition to the "doc" feature that I commented on above, I have just discovered that the auto complete function works seamlessly with the class. So, using my example of the UnitConversion class, if I type
UnitConversion.s <tab>
I get a drop-down menu of all class properties that begin with "s": {slug2lbm | slug2kg | slug2g | slug2grn } This also is a great feature of using classes.
Also, typing
UnitConversion. <tab>
will bring up a list of every property of the class. These features will be a big help in finding the value that I want.

Sign in to comment.


Answer by James Tursa
on 17 Sep 2019 at 20:31

I use a function that returns a structure, containing the values and the unit descriptions. Your code can either pass this structure around, or call the function. E.g.,
function e = earth
e.re = 6378.137; % equatorial radius
e.re_units = 'km';
e.we = 7.2921150e-5; % rotation rate
e.we_units = 'radians/sec';
e.flatinv = 298.257223563;
:
end
I put the units as strings so that simply displaying the structure will show me what the units are.

  0 Comments

Sign in to comment.