2010-04-08 4 views

Répondre

2

Quelques façons dont vous pouvez le faire ...

  • En utilisant REGEXP:

    wholeNumber = 1934;      %# Your number 
    numberString = num2str(wholeNumber,16); %# Convert to a string 
    matches = regexp(numberString,'[1-9]','match'); %# Find matches 
    firstNumber = str2double(matches{1}); %# Convert the first match to a double 
    
  • En utilisant ISMEMBER:

    wholeNumber = 0.04;      %# Your number 
    numberString = num2str(wholeNumber,16); %# Convert to a string 
    isInSet = ismember(numberString,'123456789'); %# Find numbers that are 
                   %# between 1 and 9 
    numberIndex = find(isInSet,1);   %# Get the first number index 
    firstNumber = str2double(numberString(numberIndex)); %# Convert to a double 
    

EDIT:

Une discussion de ce sujet s'est produite sur l'un des the MathWorks blogs. Quelques solutions supplémentaires intéressantes sont fournies ici. Une question qui a été soulevée avait des solutions vectorisées, voici donc d'une version vectorisée je suis venu avec:

numberVector = [1934 0.04 -56]; 
numberStrings = cellstr(num2str(numberVector(:),16)); 
firstIndices = regexp(numberStrings,'[1-9]','once'); 
firstNumbers = cellfun(@(s,i) s(i),numberStrings,firstIndices); 
4
function res = first_digit(number) 
    number = abs(number); 
    res = floor(number/(10^floor(log10(number)))); 
end

Il fonctionne pour tous les nombres réels (voir le commentaire de gnovice pour un cas extrême)

+0

Whoops, promesse que je ne l'ai pas copie de votre réponse, Yassin! Vous devez avoir posté pendant que je découvrais ma solution. +1 pour penser à utiliser abs() pour couvrir ces négatifs embêtants. – Doresoom

+0

+1: Je savais qu'il y avait probablement un moyen de le faire mathématiquement, mais les premières solutions auxquelles je pensais étaient basées sur des chaînes. – gnovice

+0

@gnovive: Merci. Corrigé! – yassin

1

Utilisation des fonctions intégrées log10 et floor,

floor(x./10.^floor(log10(x))) 

renvoie également le premier chiffre de tous les éléments d'un tableau.

0

Permettez-moi d'ajouter une autre solution basée sur une chaîne (vectorisé ainsi):

FirstDigit = @(n) sscanf(num2str(abs(n(:)),'%e'), '%1d', numel(n)); 

et testé sur les cas mentionnés ici:

>> FirstDigit([1934 0.04 -56 eps(realmin)]) 
ans = 
    1 
    4 
    5 
    4 
Questions connexes