2015-10-06 7 views
1

Я пытаюсь вычислить длину целого числа.MATLAB вычислить длину целого числа

Например:

a = 1.1234; b = 33; c = 100; d = -222; 
e = lengthint([a,b,c,d]) 

Ожидаемый результат:

e = 1 2 3 3 

Я попытался с помощью этого:

e = max(ceil(log10(abs([a,b,c,d]))),1) 

, но это выход:

e = 1 2 2 3 

Таким образом, существует проблема с числами, кратными 10.

+0

Не принимайте 'ceil'. 'floor (log10 (number))' даст вам десятилетие, которое вы хотите, а затем «добавить один», чтобы найти количество цифр в вашем целых числах. Хм, предположим, я должен был посмотреть ответы, прежде чем комментировать. :-) Извините, @Divikar –

ответ

7

Вы можете сделать что-то вроде этого -

A = [a,b,c,d] 
lens = floor(log10(abs(A)))+1 
lens(lens<0) = 0 %// Assuming that 0.xx numbers to have zero lengths 

Примеры пробеги:

Дело № 1:

>> A = [0.000, 1.1234, 33, 10, -222]; 
>> lens = floor(log10(abs(A)))+1; 
>> lens(lens<0) = 0 
lens = 
    0  1  2  2  3 

Дело № 2:

>> A = [-0.000, 1.1234 33, 10, -222, 0]; 
>> lens = floor(log10(abs(A)))+1; 
>> lens(lens<0) = 0 
lens = 
    0  1  2  2  3  0 
4

Другим вариантом было бы, чтобы преобразовать их в строки и проверить длину:

cellfun(@(x)length(num2str(abs(fix(x)))),{a,b,c,d}); 

единственная сложность заключается в том, что вам нужно клетки, чтобы сохранить ваши строки отдельно.

Выход из @example input Divakar в:

>> a1 = 0.000; a2 = 1.1234; b = 33; c = 100; d = -222; 
>> cellfun(@(x)length(num2str(abs(fix(x)))),{a1,a2,b,c,d}) 

ans = 

    1  1  2  3  3 

так будет, очевидно, не дают 0 для случая 1e-5.

+0

'1' показался хорошим выбором для такого случая« 1е-5 », но я не был на 100% уверен, что должен быть выходом для такого случая. – Divakar

+0

@ Дивакар, я думаю, это зависит от соглашения. Я бы назвал 0 целым числом длины 1, но я легко могу представить, что OP думает иначе :) –

+0

Да, я использую этот подход для удвоения или уменьшения масштаба: 'x = 1.0034; y = str2num (strrep (num2str (x), '.', '')); expo = log10 (y/x) 'и т. д. –

Смежные вопросы