• Регистрация
4ergy
4ergy 0.00
н/д

Генерация переменной в виде буквенно-числового кода и несколько mat-файлов из одного большого

14.12.2019

Приветствую,

В матлабе совсем новичек, помогите решить несколько задачек. .

1)  Нужно провести вычисления с матрицей произвольного размера (потенциально большого, на сотни тысяч строк) :

Есть mat-файлы A и B содержащие матрицы day (все даты измерений включая мастер дату), master_day (мастер дата в одной ячейке) и ph (массив с измерениями).

По количеству столбцов ph всегда меньше на один чем day (т.е. в нем нет столбца соотвествующего мастер дате), но нужно его найти и добавить нулевым в массив ph. 

Далее, последовательно вычесть из всех столбцов значения первого, а потом его сделать нулевым. Все сохранить в тот же массив. Для этого руками пользуюсь строкой ph(:,2:end)=ph(:,2:end)-ph(:,1);

2) Требуется сгенерить переменную (code_n), содержащую произвольный буквенно-числовой код для каждой строки в исходной матрице (ph).

Есть вот такой рабочий код, но не знаю как его зациклить на количество строк в исходной матрице и на сколько он будет быстро выполняться если у нас условно 1 млн. строк.

 s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

numRands = length(s); 

sLength = 5;

code_n = s( ceil(rand(1,sLength)*numRands) )

3) Как разбить один большой mat-файл на несколько по 2 Gb? Например, если исходный = 3Gb, разбить на - 2 и 1Gb, соответственно. Далее сделать конвертацию из каждого mat-файла в txt последовательно - dlmwrite('Export.txt', Export, 'precision',10.

Спасибо.

Теги

    14.12.2019

    Ответы

    • Павел Рословец
      Павел Рословец +239.28
      16.12.2019 15:06

      1) Вычитайте сразу из всей матрицы ph первый столбец, тогда он автоматически обнулится

      ph = ph - ph(:,1)

      2) Не надо зацикливать код, делайте сразу матрицу строк

      sLength = 5; % длина кодовой строки
      sHeight = 10; % необходимое кличество строк
      s = char([48:57 65:90]); % генерируем набор символов
      numRands = length(s); % находим длину набора
      randIdx = randi(numRands, sHeight, sLength); % генерируем матрицу индексов символов
      randStrings = string(s(randIdx)) % извлекаем символы и генерируем массив строк

      3) Чтобы разбить файл, надо считать из него данные, разбить их на переменные, и их сохранять в отдельные файлы. Если оперативной памяти компьютера не хватает, чтобы полностью считать данные из mat-файла, можно воспользоваться fileDatastore, чтобы обработать Big Data. Для этого придется изучить документацию

      https://www.mathworks.com/help/matlab/ref/matlab.io.datastore.filedatastore.html

      Конвертацию в текст тоже надо делать вручную, например, с помощью приведенного кода. Для нескольких mat-файлов надо в цикле пройтись по каждому, чтобы считать и сохранить в текст, либо опять-таки применить fileDatastore, он сам по всем указанным файлам пройдется.