Как преобразовать строку чисел из входных данных в массив / вектор?

#matlab

#matlab

Вопрос:

Ввод числа, например

 StudentNo = input('Please input your student number: ')
 

так что

 StudentNo = 54456842
 

Вводим это, а затем превращаем в отдельные числа

 StudentNo = [5,4,4,5,6,8,4,2]
 

чтобы найти среднее значение или другую статистику по цифрам, не получая NaN?

Комментарии:

1. Будет ли номер студента всегда состоять из одной цифры или он будет меняться?

Ответ №1:

Вы можете разбить его на цифры с помощью следующего подхода

 str2num(num2str(StudentNo).')
 

Сначала это преобразуется StudentNo в строку, затем выполняется транспонирование таким образом, чтобы каждый символ находился в отдельной строке, а затем мы вызываем str2num преобразование каждой строки в отдельное число.

Другим вариантом было бы преобразовать в строку, а затем вычесть значение ASCII '0' для преобразования каждого символа в числовую цифру

 num2str(StudentNo) - '0'
 

Ответ №2:

Подход Суэвера — отличный способ сделать это. Однако, если вам не нужно фактическое число в виде числа, и вам нужны только отдельные цифры, тогда вы можете напрямую указать, что вам нужны числа в виде строки в input -call .

 StudentNo = input('Please input student number: ', 's')
 

Здесь 's' указывает, что входные данные являются строкой. Таким образом, вы можете вводить StudentNo без апостроф.

 StudentNo = input('Please input student number: ', 's')
Please input student number: 54456842
StudentNo =
54456842
 

Теперь вы можете использовать любой из двух подходов в ответе Суэвера, чтобы преобразовать это в отдельные числа. Другой вариант — просто выполнить вычитание '0' в самом вызове:

 StudentNo = input('Please input student number: ', 's')-'0'
Please input student number: 54456842
StudentNo =
     5     4     4     5     6     8     4     2
 

Поскольку это немного сложно для чтения, вы также можете использовать это как анонимную функцию:

 stid = @() input('Please input student number: ', 's')-'0';
 

И назовите это так:

 stid()
Please input student number: 123456
ans =
     1     2     3     4     5     6
 

Ответ №3:

Ввод фиксирует одно число. Было бы трудно узнать, сколько цифр в каждом из номеров учащихся, поэтому я бы предложил получать их по одному:

 StudentNo = input('Please input your student number one by one (end with -1): ');
while StudentNo(end)~= -1
    StudentNo = [StudentNo, input('Please input the next student number (end with -1): ')];
end
% remove the -1
StudentNo = StudentNo(1:end-1);
 

Редактировать

На основе @StewieGriffin: комментарий если у вас многозначный номер студента, вы могли бы просто сделать это:

 StudentNo = input('Please input the next student number: ')];
[1 2 12 13]
 

Это определит каждое число как отдельную запись в векторе ваших номеров учащихся.

Комментарии:

1. Подход Suever довольно хорошо обрабатывает переменное количество цифр, поэтому я не думаю, что это большая проблема. Однако, если вы действительно хотите вводить одно за другим, вероятно, было бы проще просто ввести их все внутри скобок: [1 2 3 4] , таким образом избегая цикла while .

2. Проблема заключается в многозначных числах учащихся, например: [1 2 12 45] которые будут преобразованы в [1 2 1 2 4 5] . Я не знал, что input это действительно может [] быть правильно обнаружено.