MATLAB Answers

Help with a piece of code

3 views (last 30 days)
jip prinsen
jip prinsen on 21 Sep 2017
Commented: José-Luis on 21 Sep 2017
Hey all, I'm working on a school project that's about changing the order of characters in a binary array. In the process of writing it, I found a bit of code online to help me:
v = sprintf('%d', array3)
endarray = v - '0'
Basically, what this does is it takes the value of array3, which for example is [1011010] and creates a variable endarray, which in turn becomes [1 0 1 1 0 1 0]. When I implemented this piece of code I didn't quite know how it functioned, and it wasn't explained on the page where I found it, so I decided to go back to it later. Unfortunately I still haven't figured it out. I can't wrap my head around the combinations of sprintf, %d, and the -'0'.
Any help with understanding these two lines would be greatly appreciated.

  1 Comment

Pal Szabo
Pal Szabo on 21 Sep 2017
I recommend to replace "Help with a piece of code" with something more meaningful

Sign in to comment.

Accepted Answer

Pal Szabo
Pal Szabo on 21 Sep 2017
Edited: Pal Szabo on 21 Sep 2017
array3 is an integer. Sprintf needs to no that it is in decimal point notation, that's why you need the %d. More info: https://uk.mathworks.com/help/matlab/matlab_prog/formatting-strings.html. Strings in matlab are basically chain of chars. By subtractring -'0', you are basically subtracting 0 (decimal notation) from the ASCII values of the chars within the string. Executing an operation on each char within the chain of chars (aka on the string) gives a result of individual chars, since the operation only valid on individual chars, not on the string as a whole. Try this for example:
array3 = [1011010]
v = sprintf('%d', array3)
endarray = v - '0' - 'd'
You get
-99 -100 -99 -99 -100 -99 -100
as result. 'd' is the ASCII character with decimal value 100. https://en.wikipedia.org/wiki/ASCII
You get the same result if define endarray like this:
endarray = v - '0' - 100
Here 100 is an integer, not a chain of chars.
Sub in different values for 'd': the results are consistent with the ASCII table.
Hope this helps.
EDIT: I see you added a tag 'binary'. I do not think array3 is binary, just because it has only ones and zeros, it is pretty much a decimal value. Just like 8+2=10, 10 is not binary.

  3 Comments

José-Luis
José-Luis on 21 Sep 2017
array3 is an integer. Sprintf needs to no that it is in decimal point notation, that's why you need the %d.
How do you figure that?
sprintf('%d',0.5)
Pal Szabo
Pal Szabo on 21 Sep 2017
Okay you are right, I may be confusing the meaning of the expressions "decimal point" and "base 10". If I say
array3 is an integer. Sprintf needs to no that it is a number in base 10, that's why you need the %d.
Is this right?
José-Luis
José-Luis on 21 Sep 2017
Looks like array3 is a scalar and not a logical array.

Sign in to comment.

More Answers (1)

José-Luis
José-Luis on 21 Sep 2017
Edited: José-Luis on 21 Sep 2017
Generating a "binary" (logical) array:
a = rand(10,1) > 0.5;
Transforming the binary array into a string. v is a character array.
v = sprintf('%d', a)
Transforming the string into a numeric array:
endarray = v - '0'
Matlab does implicit conversions. When you do arithmetic operation with characters, it transforms them into double and then performs the operations.
'0' - 48
Please note that all that is unnecessary if you want an array of doubles from a logical array. You could just have:
endarray = double(a)

  2 Comments

Guillaume
Guillaume on 21 Sep 2017
The starting point is not a logical array but a binary number encoded as a decimal, e.g.
a = 1011010;
Hence the trip through a char array to get the digits of that decimal number.
José-Luis
José-Luis on 21 Sep 2017
Thanks. I was wrong but in essence sort of right.
Definitely maybe.

Sign in to comment.

Sign in to answer this question.