Help with a piece of code

2 ビュー (過去 30 日間)
jip prinsen
jip prinsen 2017 年 9 月 21 日
コメント済み: José-Luis 2017 年 9 月 21 日
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 件のコメント
Pal Szabo
Pal Szabo 2017 年 9 月 21 日
I recommend to replace "Help with a piece of code" with something more meaningful



Pal Szabo
Pal Szabo 2017 年 9 月 21 日
編集済み: Pal Szabo 2017 年 9 月 21 日
array3 is an integer. Sprintf needs to no that it is in decimal point notation, that's why you need the %d. More info: 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.
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 件のコメント
José-Luis 2017 年 9 月 21 日
Looks like array3 is a scalar and not a logical array.


その他の回答 (1 件)

José-Luis 2017 年 9 月 21 日
編集済み: José-Luis 2017 年 9 月 21 日
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 件のコメント
José-Luis 2017 年 9 月 21 日
Thanks. I was wrong but in essence sort of right.
Definitely maybe.



Find more on Characters and Strings 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!

Translated by