File Exchange Pick of the Week

Our best user submissions

‘Custom Syntax for Formatted Strings with %s’\{SPRINTF}

Greg’spick this week isNice sprintf syntax using \ (left divide)byWill Fox.

A simple entry that exemplifies the extensibility of MATLAB.

Create a formatted character array with the following syntax

c ='Hello %s, my favorite number is %.5f!'\{"Greg", pi}
c = 'Hello Greg, my favorite number is 3.14159!'

where the left argument is the format definition, and the right argument is a cell array of values applied to the format definition.

How is it done?

The author Will creates a new syntax for creating formatted character arrays in MATLAB where the left divide (MLDIVIDE) operator is used to apply theSPRINTFfunction.

MATLAB permits theoverloadingof many operators. Will took advantage of an operator that is not available for cell arrays, and added it to the Cell class of datatypes in MATLAB.

The code in this entry is very simple. It maps the input arguments to MLDIVIDE to the input arguments of SPRINTF.

Brilliance in simplicity.

Should I Learn a New Syntax?

Adding new syntaxes to your code can make things harder in the long term if they are not used consistently (at least within a particular project).

Injecting part of my philisophical view of coding, “consistency is key to readabilty”. In my experience, I spendmuch moretime reading code than writing it, so applying consistent coding patterns is a key practice for me, even if no one else will see the code. If the code written is useful then I will likely need to maintain and enhance it in the future. I apply the same ideas when constructing Simulink and Stateflow models.

I’m a fan of this very crisp syntax as more consise syntaxes can (but not always) reduce cognitive load once you have learned to interpret them.

["Let's construct a string by including this syntax:"+“% s !”\{'format'}"Adding insome"+'numbers: %f, %.0d, %-04.4g'\{exp(1), rand*10, pi}]
ans =2×1 string array"Let's construct a string by including this syntax: format!" "Adding in some numbers: 2.718282, 1e+00, 3.142"

Asimilarapproach is taken for regular expressions in Javascript where a special compact syntax is applied for constant formatted regular expressions.

But, be careful! This is not a standard syntax and it does not appear in the MATLAB Documentation. This will hinder new coders who come onto the project and are not familiar with this syntax or the ability to overload MATLAB operators.

Opportunities for Improvement

Using theISCHARandISCELLfunctions when testing for the appropraite datatypes in the MLDIVIDE function will likely improve performance with no loss of readability. Currently theISAfunction is used instead.

tic;isa('myArray','char'); toc
Elapsed time is 0.005289 seconds.
tic; ischar('myArray'); toc
Elapsed time is 0.000234 seconds.

Perhaps this can be extended for the newSTRINGdatatype introduced in MATLAB R2016b. Or applied toregular expressions我nstead!

Should concise syntaxes like this be built into the MATLAB language?

Have you ever written overloaded methods for your classes? How else could this type of syntax be used?

Let us knowhere.

|
  • print
  • send email

コメント

コメントを残すには、ここをクリックして MathWorks アカウントにサインインするか新しい MathWorks アカウントを作成します。