2014-09-23 3 views
2

Я ищу очень быстрый метод в MATLAB для поиска определенной цифры в целых числах, в идеале в данной позиции. Например:Поиск определенной цифры в целом

Простой случай ...

Я хочу посмотреть через массив целых чисел и вернуть все те, которые содержат номер 1, например, 1234, 4321, 6515, 847251737 и т.д.

Более сложный случай ...

Я хочу перебрать массив из целых чисел и вернуть все те, которые содержат число 1 в третьей цифре, например 6218473, 541846, 3115473. НО 175846 не будет возвращен.

Любые мысли?

ответ

1

Один из способов получения данных состоит в том, чтобы отличать ваши номера как строки, а затем проверить, является ли 3-я позиция этой строки '1'. Он отлично работает в цикле, но я уверен, что есть и векторизация решение:

numbers = [6218473, 541846, 3115473, 175846]' 
returned_numbers = []; 

for i = 1:length(numbers) 
    number = numbers(i); 
    y = sprintf('%d', number) %// cast to string 

    %// add number to list, if its third character is 11 
    if strcmp(y(3), '1') 
     returned_numbers = [returned_numbers, number]; 
    end 
end 

% // it returns: 
returned_numbers = 

6218473  541846  3115473 
3

Бросая в строки, трюк, чтобы vectorising просто чтобы убедиться, что x вектор-столбец. x(:) гарантирует это. Кроме того, необходимо левой кнопкой выравнивания строк, который делается с спецификатора формата '%-d' где - для левого выравнивания и d для целых чисел:

s = num2str(x(:), '%-d'); 
ind = s(:,3)=='1' 

и это также позволяет легко решить первый случай:

ind = any(s=='1',2) 

в любом случае, чтобы восстановить свой оригинальный номер просто идти:

x(ind) 
+0

Я думаю, что ваше решение не работает, поскольку не все цифры имеют одинаковое количество цифр, и мы рассчитываем слева. С примером TOs ваше решение не находит номер 541846 (всего 6 цифр). – Nras

+0

@Nras Мой плохой, исправлено сейчас – Dan

+0

Там идет -1 в +1 :-). – Nras

1

Код

%// Input array 
array1 = [-94341 1234 4321 6515 847251737 6218473 541846 3115473 175846] 

N = numel(array1); %// number of elements in input array 
digits_sep = num2str(array1(:))-'0'; %//' Seperate the digits into a matrix 

%// Simple case 
output1 = array1(any(digits_sep==1,2)) 

%// More complex case output 
col_num = 3; 

%// Get column numbers for each row of the digits matrix and thus 
%// the actual linear index corresponding to 3rd digit for each input element 
ind1 =sub2ind(size(digits_sep),1:N,... 
    size(digits_sep,2)-floor(log10(abs(array1))-col_num+1)); 

%// Select the third digits, check which ones have `1` and use them to logically 
%// index into input array to get the output 
output2 = array1(digits_sep(ind1)==1) 

код запуска -

array1 = 
     -94341  1234  4321  6515 847251737  6218473  541846  3115473  175846 
output1 = 
     -94341  1234  4321  6515 847251737  6218473  541846  3115473  175846 
output2 = 
     6515  6218473  541846  3115473 
4

Там же несколько ответов уже здесь, я брошу мою попытку в горшок.

Преобразование в строку может быть дорогостоящим, поэтому, если его можно избежать, оно должно быть.

n = 1:100000; % sample numbers 
m = 3; % digit to check 
x = 1; % number to find 

% Length of the numbers in digits 
num_length = floor(log10(abs(n)))+1; 

% digit (from the left) to check 
num_place = num_length-m; 

% get the digit 
digit_in_place = mod(floor(abs(n)./(10.^num_place)),10); 

found_number = n(digit_in_place==x); 
Смежные вопросы