День 1 Летней школы Julia 2025
作者
贡献者
using MATLAB
# Запуск MATLAB сессии
mat"1+1"
# Функция для вычисления n-го числа Фибоначчи (рекурсивная)
function fib_recursive(n)
if n <= 1
return n
else
return fib_recursive(n-1) + fib_recursive(n-2)
end
end
# Функция для вычисления n-го числа Фибоначчи (итеративная)
function fib_iterative(n)
if n <= 1
return BigInt(n)
end
a, b = BigInt(0), BigInt(1)
for i in 2:n
a, b = b, a + b
end
return b
end
# Функция для работы с массивами (сумма квадратов)
function sum_of_squares(arr)
total = 0.0
for x in arr
total += x^2
end
return total
end
# Создаем файлы с MATLAB функциями
matlab_functions_fib_recursive_matlab = """
function result = fib_recursive_matlab(n)
if n <= 1
result = n;
else
result = fib_recursive_matlab(n-1) + fib_recursive_matlab(n-2);
end
end
"""
matlab_functions_fib_iterative_matlab = """
function result = fib_iterative_matlab(n)
if n <= 1
result = n;
else
a = 0;
b = 1;
for i = 2:n
temp = b;
b = a + b;
a = temp;
end
result = b;
end
end
"""
matlab_functions_sum_of_squares_matlab = """
function result = sum_of_squares_matlab(arr)
result = 0;
for i = 1:length(arr)
result = result + arr(i)^2;
end
end
"""
matlab_functions_sum_of_squares_vectorized = """
function result = sum_of_squares_vectorized(arr)
result = sum(arr.^2);
end
"""
# Записываем функции в файл
open("fib_recursive_matlab.m", "w") do file
write(file, matlab_functions_fib_recursive_matlab)
end
open("fib_iterative_matlab.m", "w") do file
write(file, matlab_functions_fib_iterative_matlab)
end
open("sum_of_squares_matlab.m", "w") do file
write(file, matlab_functions_sum_of_squares_matlab)
end
open("sum_of_squares_vectorized.m", "w") do file
write(file, matlab_functions_sum_of_squares_vectorized)
end
# Загружаем функции в MATLAB
mat"addpath($(pwd()));" # Добавляем текущую директорию в путь MATLAB
# Создаем массивы для тестирования
n_fib = 35 # Для рекурсивного метода используем меньшее значение
n_fib_iter = 1000 # Уменьшаем для MATLAB
arr_size = 1000000 # Уменьшаем для MATLAB
test_arr = rand(Float64, arr_size)
println("Сравнение производительности Julia vs MATLAB")
println("="^50)
# Тест 1: Рекурсивное вычисление Фибоначчи
println("\n1. Рекурсивное вычисление Fib($n_fib):")
# Julia
@time julia_recursive = fib_recursive(n_fib)
println("Julia результат: ", julia_recursive)
# MATLAB
mat"tic; result1 = fib_recursive_matlab($n_fib); matlab_time = toc;"
matlab_recursive = @mget result1
matlab_time1 = (@mget matlab_time)[1]
println("MATLAB результат: ", matlab_recursive)
println("Время Julia: $(@elapsed fib_recursive(n_fib)) секунд")
println("Время MATLAB: $matlab_time1 секунд")
# Тест 2: Итеративное вычисление Фибоначчи
println("\n2. Итеративное вычисление Fib($n_fib_iter):")
# Julia
@time julia_iterative = fib_iterative(n_fib_iter)
println("Julia результат: ", string(julia_iterative)[1:20] * "...")
# MATLAB
mat"tic; result2 = fib_iterative_matlab($n_fib_iter); matlab_time = toc;"
matlab_iterative = @mget result2
matlab_time2 = (@mget matlab_time)[1]
println("MATLAB результат: ", string(matlab_iterative)[1:20]*"...")
println("Время Julia: $(@elapsed fib_iterative(n_fib_iter)) секунд")
println("Время MATLAB: $matlab_time2 секунд")
# Тест 3: Сумма квадратов массива
println("\n3. Сумма квадратов массива из $arr_size элементов:")
# Julia
@time julia_sum = sum_of_squares(test_arr)
println("Julia результат: ", julia_sum)
# MATLAB (цикл)
mat"tic; result3 = sum_of_squares_matlab($test_arr); matlab_time = toc;"
matlab_sum = @mget result3
matlab_time3 = (@mget matlab_time)[1]
println("MATLAB результат: ", matlab_sum)
println("Время Julia: $(@elapsed sum_of_squares(test_arr)) секунд")
println("Время MATLAB: $matlab_time3 секунд")
# MATLAB (векторизованный)
mat"tic; result = sum_of_squares_vectorized($test_arr); matlab_time = toc;"
matlab_vectorized = @mget result
matlab_vectorized_time = (@mget matlab_time)[1]
println("MATLAB векторизованный результат: ", matlab_vectorized)
println("Время MATLAB векторизованный: $matlab_vectorized_time секунд")
# Альтернативный подход: использование встроенных функций MATLAB
println("\n4. Использование встроенных функций MATLAB:")
# Вместо определения своих функций, используем встроенные
println("Сумма квадратов через встроенные функции:")
mat"tic; result4 = sum($test_arr .^ 2); matlab_time = toc;"
matlab_builtin = @mget result4
matlab_builtin_time = (@mget matlab_time)[1]
println("MATLAB встроенный результат: ", matlab_builtin)
println("Время MATLAB встроенный: $matlab_builtin_time секунд")
# Сравнение производительности
println("\n" * "="^50)
println("ИТОГИ СРАВНЕНИЯ:")
julia_time_recursive = @elapsed fib_recursive(n_fib)
julia_time_iterative = @elapsed fib_iterative(n_fib_iter)
julia_time_sum = @elapsed sum_of_squares(test_arr)
speedup_recursive = round(matlab_time1 / julia_time_recursive, digits=1)
speedup_iterative = round(matlab_time2 / julia_time_iterative, digits=1)
speedup_sum = round(matlab_time3 / julia_time_sum, digits=1)
println("Рекурсивный Fib: Julia $(speedup_recursive)x быстрее")
println("Итеративный Fib: Julia $(speedup_iterative)x быстрее")
println("Сумма квадратов (цикл): Julia $(speedup_sum)x быстрее")
# Очистка
rm("fib_recursive_matlab.m") # Удаляем временные файлы
rm("fib_iterative_matlab.m") # Удаляем временные файлы
rm("sum_of_squares_matlab.m") # Удаляем временные файлы
rm("sum_of_squares_vectorized.m") # Удаляем временные файлы
println("\nСравнение завершено!")