How to extract leading non-zero digit?

12 visualizaciones (últimos 30 días)
John Booker
John Booker el 4 de En. de 2011
Comentada: Asif Newaz el 22 de Nov. de 2019
I'm working on a research problem related to Benford's Law which states that the distribution of leading digits is not random. This is probably because many things grow logarithmically. I am trying to extract the leading digit from these vectors below:
10 --> 1
13 --> 1
0.3 --> 3
-4 --> 4
-5 --> 5
-0.006 --> 6
Input will be a vector
x = [1 0.3 -2 0.001 -0.0006, 582398, 3020];
Output should be
y = [1 3 2 1 6 5 3];
Any help?

Respuesta aceptada

Walter Roberson
Walter Roberson el 20 de En. de 2011
The answer is complicated because numbers such as 0.0006 have no exact representation in binary floating point number, and the closest number that can be represented might not have the same leading binary digit.
If one does NOT take that factor in to account, then:
y = floor(abs(x) ./ 10.^floor(log10(abs(x))));
  2 comentarios
Jan
Jan el 28 de Jun. de 2012
I suggest to accept this one.
John Booker
John Booker el 1 de Ag. de 2013
Sorry it took me so long to accept. I stole this question from Ned before Answers launched and forgot about it =).

Iniciar sesión para comentar.

Más respuestas (3)

Ned Gulley
Ned Gulley el 11 de En. de 2011
You'll probably need to do some kind of textual manipulation. Here's one way to do it.
function y = leadingDigit(x)
s = sprintf('%1.2e\n',abs(x));
y = s(1:(length(s)/length(x)):end)-48;
end

Daniel Shub
Daniel Shub el 28 de Jun. de 2012
Is this really the first question on Answers? I was going to use our new magic power and start accepting answers. The only problem is I think there is now a better answer to this question on Loren's blog.
  1 comentario
Jan
Jan el 28 de Jun. de 2012
I thought of accepting this answer, because it contains a link to good solutions. But actually the method shown by Walter hits the point (and is found in this blog also). Ned's method is more efficient than STR2DOUBLE, but a clean numerical approach is moire direct for a numerical question.

Iniciar sesión para comentar.


Oleg Komarov
Oleg Komarov el 5 de Sept. de 2012
Another solution based on regexp (from this question):
regexp(num2str(x), '(?<=(^|\s+)[\-\.0]*)[1-9](?=[\d\.]*)', 'match')
  1 comentario
Asif Newaz
Asif Newaz el 22 de Nov. de 2019
can u explain the 'expression'... i've found regexp quite complicated but very useful

Iniciar sesión para comentar.

Categorías

Más información sobre Particle & Nuclear Physics en Help Center y File Exchange.

Etiquetas

Productos

Community Treasure Hunt

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

Start Hunting!

Translated by