Документация Engee
Notebook

Julia, MATLAB и Python: сравнительный справочник синтаксиса для научных вычислений

Введение

Современные инженерные и научные вычисления всё чаще используют сразу несколько языков программирования. MATLAB остаётся популярным в математическом моделировании, Python — в анализе данных и автоматизации, а Julia активно развивается как высокопроизводительный язык для научных вычислений.

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

Данный пример представляет собой практическое сравнение синтаксиса Julia, MATLAB и Python в формате «операция → реализация в языке». Сравнительный формат позволяет не только быстрее освоить новый язык, но и лучше понять общие принципы научного программирования. Во многих случаях различается лишь форма записи, тогда как сама вычислительная логика остаётся одинаковой.

Сравнение основного синтаксиса

Операция

Julia

MATLAB

Python

Комментарий

% comment

% comment

# comment

Многострочный комментарий

#= ... =#

%{ ... %}

""" ... """

Присваивание

x = 10

x = 10

x = 10

Динамическая типизация

x = 1; x = "hi"

x = 1; x = "hi"

x = 1; x = "hi"

Проверка типа

typeof(x)

class(x)

type(x)

Целое число

x = 10

x = int64(10)

x = 10

Число с плавающей точкой

x = 1.5

x = 1.5

x = 1.5

Комплексное число

1 + 2im

1 + 2i

1 + 2j

Бесконечность

Inf

Inf

float("inf")

NaN

NaN

NaN

float("nan")

Строка

s = "Hello"

s = "Hello"

s = "Hello"

Интерполяция строк

"x = $x"

sprintf("x = %d", x)

f"x = {x}"

Конкатенация строк

"a" * "b"

["a" "b"]

"a" + "b"

Повтор строки

"Hеllo"^3

repmat("Hеllo",1,3)

"Hello"*3

Создание массива/вектора

[1,2,3]

[1,2,3]

[1,2,3]

Матрица

[1 2; 3 4]

[1 2; 3 4]

np.array([[1,2],[3,4]])

Индексация начинается с

1

1

0

Доступ к элементу

A[1,2]

A(1,2)

A[0,1]

Последний элемент

A[end]

A(end)

A[-1]

Срез массива

A[1:3]

A(1:3)

A[0:3]

Логическая индексация

A[A .> 0]

A(A > 0)

A[A > 0]

Размер массива

size(A)

size(A)

A.shape

Длина массива

length(A)

length(A)

len(A)

Создание нулевого массива

zeros(3,3)

zeros(3,3)

np.zeros((3,3))

Создание единичной матрицы

I(3) / Matrix(I,3,3)

eye(3)

np.eye(3)

Диапазон

1:10

1:10

range(1,11)

Шаг диапазона

1:2:10

1:2:10

range(1,11,2)

Поэлементное умножение

A .* B

A .* B

A * B

Матричное умножение

A * B

A * B

A @ B

Поэлементная степень

A .^ 2

A .^ 2

A ** 2

Деление матриц

A \ b

A \ b

np.linalg.solve(A,b)

Транспонирование

A'

A'

A.T

Конкатенация массивов по горизонтали

[A B]

[A B]

np.hstack((A,B))

Конкатенация массивов по вертикали

[A; B]

[A; B]

np.vstack((A,B))

Условие if

if x > 0 ... end

if x > 0 ... end

if x > 0:

Тернарный оператор

x > 0 ? a : b

ifelse(x>0,a,b)

a if x>0 else b

Цикл for

for i in 1:10 ... end

for i in 1:10 ... end

for i in range(10):

Цикл while

while x > 0 ... end

while x > 0 ... end

while x > 0:

Прерывание цикла

break

break

break

Пропуск итерации

continue

continue

continue

Функция (кратко)

f(x)=x^2

f = @(x) x^2

f = lambda x: x**2

Функция (обычная)

function f(x) ... end

function y=f(x) ... end

def f(x):

Возврат значения

return x

return x

return x

Анонимная функция

x -> x^2

@(x) x^2

lambda x: x**2

Генератор списка

[x^2 for x in 1:5]

arrayfun(@(x)x^2,1:5)

[x**2 for x in range(1,6)]

Словарь

Dict("a"=>1)

containers.Map()

{"a":1}

Множество

Set([1,2])

unique([...])

set([1,2])

Проверка принадлежности

x ∈ A

ismember(x,A)

x in A

Обработка исключений

try ... catch e ... end

try ... catch ... end

try ... except Exception as e:

Генерация ошибки

error("msg")

error("msg")

raise Exception("msg")

Структура/класс

struct Point ... end

classdef Point ... end

class Point:

Абстрактный тип

abstract type Shape end

classdef (Abstract)

from abc import ABC

Импорт модуля

using LinearAlgebra

import pkg.*

import numpy as np

Подключение файла

include("a.jl")

run("a.m")

import module

Документация функции

""" doc """

% help text

""" doc """

Макросы

@time, @show

отсутствуют

отсутствуют

Измерение времени

@time expr

tic; ...; toc

timeit()

Вывод в консоль

println(x)

disp(x)

print(x)

Форматированный вывод

@printf

fprintf

print(f"...")

Работа с DataFrame

DataFrame(...)

table(...)

pd.DataFrame(...)

Графики

plot()

plot()

matplotlib.pyplot.plot()

Случайное число

rand()

rand()

random.random() / np.random.rand()

Сортировка

sort(A)

sort(A)

sorted(A)

Map-функция

map(f,A)

arrayfun(f,A)

map(f,A)

Фильтрация

filter(f,A)

A(mask)

filter(f,A)

Проверка равенства

==

==

==

Проверка идентичности

===

isequal

is

Отсутствующее значение

missing

missing

None / np.nan

Ничего / null

nothing

[]

None

Заключение

Julia, MATLAB и Python не столько конкурируют, сколько дополняют друг друга в современных инженерных и научных задачах. Несмотря на различия в философии и деталях синтаксиса, большинство вычислительных конструкций между ними имеют прямые аналоги.

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