Советы, которые я извлек из моего более чем 4-летнего путешествия, работы и программирования на Matlab.

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

Я начал программировать в Matlab около 4 лет назад, и это путешествие было захватывающим и полным познания. Я начал писать код на Matlab для своих курсовых проектов еще во время учебы на бакалавриате, а теперь использую его на постоянной основе для исследования своей кандидатской диссертации. Во время моего путешествия было несколько раз, когда мне приходилось ждать от нескольких часов до дней, пока мои симуляции сойдутся. Я всегда задавался вопросом - как я могу сделать это быстро, как сделать так, чтобы циклы for выполнялись быстрее? Более того, некоторые из моих работ требовали распределенной настройки, то есть разных версий Matlab, которые общались друг с другом. , обмен информацией и запуск алгоритмов для выполнения определенной задачи. Я всегда задавался вопросом - как я мог это сделать? Как мне сделать мой код достаточно крутым, чтобы он был реалистичным?

В этой статье я поделюсь некоторыми полезными советами по программированию, которые я узнал за 4 года программирования и экспериментов с Matlab. Давайте начнем !

1. Более быстрые циклы for

Циклы For, вероятно, являются одним из наиболее широко используемых блоков кода в Matlab. Для запуска итерационных алгоритмов, вычисления матричных произведений по набору данных или моделирования системы во времени, циклы for используются повсеместно. Циклы For вычисляют каждую итерацию последовательно, что замедляет выполнение большого количества итераций и массивных вычислений. На помощь приходит Matlab's Parallel Computing Toolbox.



Например, рассмотрим этот очень простой пример, в котором мне нужно вычислить поэлементную сумму записей в матрице a и b , и сохранить результат в c.

a = randn(1e7,1e7);
b = randn(1e7,1e7);
c = zeros(1e7,1e7);
for i=1:1e7
    for j=1:1e7
      c(i,j) = a(i,j) + b(i,j);
    end
end

В моем тестировании это вычисление цикла занимает около 7,72 секунды. Давайте посмотрим, как здесь можно использовать параллельный цикл for.

Во-первых, объявите количество рабочих процессов, которое может быть максимальным количеством гиперпоточных ядер вашего процессора.

parpool(4); %declare number of workers (max=cores) 
parfor i=1:1e7 %use parfor instead of for
    for j=1:1e7
      c(i,j) = a(i,j) + b(i,j);
    end
end
delete(gcp('nocreate')); %close parallel computing

Обратите внимание, что вложенные циклы for не допускаются, поэтому мы меняем один из циклов for на параллельный цикл и оставляем внутренний цикл таким же. Та же задача теперь занимает всего 1,36 секунды. Набор инструментов для параллельных вычислений не только ограничен циклами for, но и имеет множество полезных функций, позволяющих ускорить выполнение ваших симуляций, чтобы вы могли хорошо выспаться.

2. Индикатор выполнения (с расчетным временем прибытия)

Вы когда-нибудь ждали, задаваясь вопросом сколько времени потребуется, чтобы ваш код завершил выполнение? Я уверен, что вы пробовали различные варианты, один из которых выводит номер итерации цикла, а затем делает предположительная оценка того, сколько времени потребуется для завершения. Что ж, не делай этого больше!



Вы можете использовать это дополнение для всех циклов while и for, чтобы не только увидеть процент достигнутого прогресса, но и получить расчетное время завершения. Это действительно здорово, и я использую его во всех своих проектах Matlab. Использование так же просто, как показано ниже.

h = waitbar(0,'Please wait...'); %handle for the waitbar
for i=1:1e7
c(i) = a(i) + b(i);
waitbar(i/1e7,h); %update waitbar status
end

Вы увидите индикатор выполнения, как показано на изображении, с «процентом выполнения» и «приблизительным оставшимся временем».

3. Распределенные алгоритмы или общие данные

Распределенные алгоритмы - это алгоритмы, которые работают на разных компьютерах для совместного выполнения определенной задачи. Особенно в больших системах используются распределенные алгоритмы, чтобы сделать такие алгоритмы более быстрыми и менее интенсивными на одном процессоре. Такая установка также требует, чтобы данные были совместно использованы разными компьютерами.

Однако в большинстве случаев при моделировании таких алгоритмов мы просто пишем один фрагмент кода, который последовательно запускается в одной среде Matlab. Хотя это может привести к правильному окончательному результату, но становится трудно визуализировать, как это будет сходиться при реализации в реальной распределенной установке. Я покажу вам, как я научился делать это круто и реалистично, используя простые фрагменты кода.

Рассмотрим пример, где у меня есть 2 разных компьютера PC1 и PC2. Оба они генерируют случайное число по отдельности, а затем должны сообщить свои числа друг другу, чтобы сообщить сумму обоих чисел обоим пользователям на ПК. Хотя это кажется очень простой проблемой, она даст вам понимание лежащей в основе методологии, чтобы сделать решения более реалистичными.

Код для ПК 2

r = floor(10*rand(1,1)); %random number
disp(strcat('PC2 chose random number as : ',num2str(r)));
tot = r; %total
fid = -1;
while fid==-1
%data.txt is the shared file used for communication
    fid = fopen('data.txt','a');
    fprintf(fid,'%d %d\n',2,r);
    pause(1);
    fclose(fid);
end
i=0;
while i==0
    disp('PC 2 is attempting to get data from PC 2')
    fid = fopen('data.txt','r');
    tmp=fscanf(fid,'%d %d\n');
    fclose(fid);
    if (size(tmp)~=0)
        if (tmp(1)==1)
        tot = tot+tmp(2); %read PC1 data from shared file
        i=1;
        disp(strcat('Our total is > ',num2str(tot)));
     
    else
         disp('PC 1 has not yet written data');
    end
pause(rand(1,1)); %pause for small random time
end
fclose('all'); %close all files

Обратите внимание, что здесь data.txt служит файлом связи. Аналогичный код выполняется на ПК 1, где он считывает тот же файл data.txt, чтобы узнать, какой ПК 2 предоставил общий доступ.

Вы можете видеть на изображении GIF выше, как две отдельные среды MATLAB (эквивалентные двум ПК) выбирают случайное число, а затем связывают его друг с другом через файл .txt, чтобы получить тот же окончательный ответ 11. Круто, не правда ли. не так ли? Это только начало. С этой идеей можно сделать гораздо более крутые вещи. Если вам нужен более реалистичный сценарий, вы также можете поделиться данными через удаленные серверы SQL. Это позволит смоделировать более реалистичные условия, когда программы работают на двух разных компьютерах в любой точке мира, и при этом они приходят к одному и тому же ответу 11.



4. Векторизуйте свои вычисления.

Одна из наиболее распространенных ошибок, которые делают люди при использовании функций Matlab, - это использование циклов for для выполнения определенных вычислений векторов. Например, рассмотрим функцию minProduct, которая возвращает минимум произведения входных данных трех векторов: x,y,z. Традиционно для этого пишут цикл for, как показано ниже.

function d = minProduct(x,y,z)
% find the minimum of product of entries of x, y, z
d = zeros(length(x),1);
for i=1:d
d(i) = x(i)*y(i)*z(i); %compute product and store
end
d = min(d); %output the minimum of vector d

Однако, если мы напишем вышеуказанную функцию в векторизованном виде, назвав ее minProductVectorized, то код будет выглядеть следующим образом.

function d = minProductVectorized(x,y,z)
% find the minimum of product of entries of x, y, z
d = x.*y.*z;
d = min(d); %output the minimum of vector d

Запуск этой функции для 3 случайных векторов x,y,z, состоящих из 100 000 записей каждый, minProduct занимает 0,23 секунды, тогда как minProductVectorized вычисляет минимальное значение всего за 0,089 секунды.

5. Живой скрипт

Живой скрипт - одна из самых малоиспользуемых функций Matlab. Он был представлен с выпуском Matlab 2016 года, но до сих пор остается неизвестным или неиспользуемым большинством студентов, преподавателей и исследователей. Я продемонстрирую эффективность этого на простом примере.

Учтите, я хочу построить sin (nx) для x=0:0.01:10. Здесь n может быть любым числом, и я смогу построить все кривые от 1,2 до… n. Итак, если n=3, мой график должен содержать графики для sin(x), sin(2x) и sin(3x). В традиционном сценарии Matlab мы определяем параметр n и вручную меняем его значение каждый раз, когда нам нужно больше кривых. Однако с живым скриптом мы можем просто вставить ползунок для n, и Matlab позаботится о том, чтобы правильно запустить код, чтобы адаптировать сюжет.

Разве это не красиво? Когда я впервые попробовал его, меня поразило, насколько просто, но эффективно управлять своим кодом с помощью живых скриптов. Это может показаться очень простым примером, но он пригодится, когда вам нужно изменить переменные в нескольких точках кода, чтобы увидеть результат. Редактирование вручную утомительно, сложно отслеживать и может привести к ошибкам в вашем красивом коде. Скорее украсьте его, используя этот простой инструмент для визуализации результатов на ходу. Его легко освоить, и он определенно поможет вам в реализации ваших кодов для различных параметров.



Надеюсь, вам понравилась эта статья, и вы узнали новые способы использования Matlab, чтобы сделать ваши коды более быстрыми и реалистичными. Это были некоторые важные советы, которые я усвоил за 4 года работы с Matlab днем ​​и ночью. Если вы хотите поделиться другими полезными советами, не стесняйтесь оставлять комментарии ниже.

Спасибо за прочтение. Если вы хотите рассказать об этой статье, напишите мне по адресу [email protected].

Если вам понравилась эта история, вы можете взглянуть на нее.









Почему я бросил свою работу за 70 тысяч долларов ради« скучной жизни?
Моя единственная мечта после поступления в один из самых престижных институтов Индии, IIT Delhi, заключалась в том, чтобы получить высокооплачиваемый… medium.com »