Как принимать время от пользователя и сохранять их в массив в matlab?

#arrays #matlab #time

#массивы #matlab #время

Вопрос:

Я хочу принять (скажем) 3 элемента времени (например 8:30, 8:20 amp; 8:00) от пользователя и сохраните его в массиве, используя ‘datenum’. Как я могу этого добиться? Пожалуйста, помогите.

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

1. У вас возникла проблема, связанная с конкретным кодом?

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

3. @Vakh: Я знаю, что могу хранить элементы времени в переменной, используя ‘datenum’. Но я не знаю, как сохранять элементы времени с помощью пользовательских подсказок.

4. @rayryeng: Я попробую. Надеюсь, это сработает.

5. Я напишу для вас пример. Дайте мне минутку

Ответ №1:

Предполагая, что вы просто хотите запросить у пользователя текущий день и год, и вам нужно только текущее время (часы и минуты — секунды равны 0), вы можете сделать следующее:

 dateNumArray = []; %// Store datenums here

%// Enter a blank line to quit this loop
while true
    timestr = input('Enter a time: ', 's');
    if (isempty(timestr))
        break;
    end
    %// Split the string up at the ':'
    %//splitStr = strsplit(timestr, ':'); %// For MATLAB R2012 and up
    splitStr = regexp(timestr, ':', 'split');

    %// Read in the current date as a vector
    %// Format of: [Year, Month, Day, Hour, Minute, Second]
    timeRead = clock;
    %// Replace hours and minutes with user prompt
    %// Zero the seconds
    timeRead(4:6) = [str2num(splitStr{1}) str2num(splitStr{2}) 0];

    %// Convert to datenum format
    dateNumArray = [dateNumArray datenum(timeRead)];
 end
  

Что делает приведенный выше код, так это то, что мы будем продолжать цикл для пользовательского ввода, где ожидается, что время будет в HH:MM формате. Обратите внимание, что я не выполнял проверку ошибок, поэтому ожидается, что HH это значение находится между 0-23, а MM между 0-59. Вы продолжаете вводить числа, вводя ENTERили RETURNдля каждой записи. Он анализирует это как строку, разбивает строку на : символ и преобразует каждую часть до и после : символа в число. Затем мы получаем текущее время, когда каждый час и минута были записаны с помощью clock команды. Это в векторе из 6 элементов, где записываются год, месяц, день, час, минута и секунда. Мы просто заменяем час и минуту на то, что мы читаем от пользователя, и обнуляем секунды. Мы, наконец, используем этот вектор и добавляем его к dateNumArray переменной, где каждый раз, когда пользователь записывает время, мы будем добавлять datenum число в этот массив.

Когда вы вызываете это, вот пример сценария:

 Enter a time: 8:30
Enter a time: 8:45
Enter a time: 8:00
Enter a time: 
  

Вот пример вывода выше:

 format bank %// Show whole numbers and little precision
dateNumArray
format %// Reset format

dateNumArray =

 735778.35     735778.36     735778.33
  

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

1. Я получаю эту ошибку. Неопределенная функция ‘strsplit’ для входных аргументов типа ‘char’.

2. Это странно… strsplit это встроенная функция MATLAB, но она поддерживается только с 2012 года и далее. Используйте это вместо: regexp(timestr,':','split');

3. да, я получил источник ошибки. В моей версии matlab нет этой функции strsplit.

4. новая ошибка. Индекс превышает размеры матрицы. Ошибка в userInput (строка 16) timeRead(4:6) = [str2num(splitStr{1}) str2num(splitStr{2}) 0];

5. @Necromancer — regexp выражение должно работать. Я только что проверил это. Пожалуйста, используйте измененный код, который я написал выше. Я не думаю, что вы используете его правильно.