Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
187 / 192 / 43
Регистрация: 13.05.2013
Сообщений: 709

Оптимизация кода

01.06.2015, 01:38. Показов 1185. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Получен рабочий код, но работающий очень медленно (пока что рекорд 56 часов =D), мне бы его оптимизировать чутка.
Есть мысли по поводу движения в сторону векторов вместо циклов, но как для каждого элемента проверять определённые условия мне не ясно.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
clear; clc; close;
 
d = 0.1; ai = -0.95:0.01:3.15; bi = -1.05:0.01:1.25; [a,b] = meshgrid(ai,bi);
 
l1 = b < d*a+1-d;
l2 = b > (a-2)*(1+d);
l3 = b > (d-1)*a;
l = l1&l2&l3;
C = contour(a,b,l,1,'r');
 
gn = 0.5;
num_ab = 0;
num_fi = 0;
num_x = 0;
HeycT = true;
kx = -2:4/50:2;
kfi = -0.99*pi:1.98*pi/50:0.99*pi;
maccuB_fi = zeros(length(kx)*length(kfi),1);
maccuB_x = maccuB_fi;
maccuB_ab = zeros(length(ai)*length(bi),2);
R = eps;
tic
for a = ai
    a
    for b = bi
        if (b < d*a+1-d) && (b > (a-2)*(1+d)) && (b > (d-1)*a)          
            for x1 = kx
                for fi1 = kfi
                    for n = 1:2000
                        fi2 = fi1-a*fi1+x1;
                        x2 = -b*fi1+d*x1+gn;
                        while or(fi2 > pi, fi2 < -pi) == 1
                            if fi2 > pi
                                fi2 = fi2-2*pi;
                            elseif fi2 < -pi
                                fi2 = fi2+2*pi;
                            end;
                        end;
                        fi1 = fi2;
                        x1 = x2;
                        if a-d*a+b == 0
                            x_cT = a*gn/eps;
                            fi_cT = gn/eps;
                        else
                            x_cT = a*gn/(a-d*a+b);
                            fi_cT = gn/(a-d*a+b);
                        end;
                        if (fi2-fi_cT)^2/R^2 + (x2-x_cT)^2/R^2 < 1
                            HeycT = false;
                            break;
                        elseif n == 2000
                            HeycT = true;
                        end;
                    end;
                    num_fi = num_fi+1;
                    num_x = num_x+1;
                    maccuB_fi(num_fi,1) = fi2;
                    maccuB_x(num_x,1) = x2;
                    if HeycT == true
                        break;
                    end;         
                end;
                if HeycT == true
                    break;
                end;
            end;
            if HeycT == false
                num_ab = num_ab+1;
                maccuB_ab(num_ab,1) = a;
                maccuB_ab(num_ab,2) = b;
            end;
            HeycT = true;
            num_fi = 0;
            num_x = 0;
            maccuB_fi = zeros(length(kx)*length(kfi),1);
            maccuB_x = maccuB_fi;
        end;
    end;
end;
toc
hold on;
grid on;
plot(maccuB_ab(:,1), maccuB_ab(:,2), '.b');
 
xlabel('a'); ylabel('b');
От первого условия можно избавиться, заодно уменьшить массив и перейти к нужным векторам:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i = 0;
for a = ai
    for b = bi
        if (b < d*a+1-d) && (b > (a-2)*(1+d)) && (b > (d-1)*a)
            i = i+1;
            BeKTop_a(i,1) = a;
            BeKTop_b(i,1) = b;
        end;
    end;
end;
 
maccuB_ab = zeros(length(BeKTop_a),2);
 
a = BeKTop_a;
b = BeKTop_b;
А вот как дальше работать с векторами, без поэлементного пересчёта не знаю.

Вкратце что делает программа:
Берём начальные условия: a,b,x1,fi и др.. Засовываем всё это в систему, которая в цикле 'for n': fi2=...; x2=...; И начинаем гонять по кругу, вносим некоторые изменения и проверяем условие, в случае выполнения которого мы выходим из цикла 'for n' (чтоб не считать лишний раз) и меняем начальные условия. И так далее. Затем строим получившийся массив данных. Прикрепляю примерный график который должен получиться(может немного меняться). На dB не обращайте внимания, лишние переменные и команды забыл закомментировать.
Миниатюры
Оптимизация кода  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2015, 01:38
Ответы с готовыми решениями:

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона для функции 2*X12 - X1*X2 + 3*X22 -...

Оптимизация кода
Здравствуйте! Написал программку, помогите, пожалуйста оптимизировать код: Задание: Считайте матрицу из файла matr.txt, замените в ней...

Оптимизация кода (импорт из маткада)
Добрый день, есть необходимость перенести программу из маткада (см. вложение) в матлаб, с максимальной оптимизацией по времени вычисления....

1
533 / 438 / 47
Регистрация: 17.07.2013
Сообщений: 2,236
01.06.2015, 08:58
См. стр. 243. $ 15.20 О скорости...
_Дьяконов А Г АНАЛИЗ ДАННЫХ MATLAB ВМК МГУ 2010 г 278 стр
В других книжках тоже есть, что почитать:
См. стр. 312. О скорости вычислений при вейлет-преобразованиях.
_Дьяконов, Абраменкова - MATLAB обработка сигналов и изображений 2002 г 608 стр
См. стр. 938 Ускорение работы М-файлов, экономия памяти
_Ануфриев Смирнов Смирнова MATLAB 7 (наиболее полное руководство) 2005 1104 c

Посмотрите на свой hard, где "тормоза" - диск, проц.

Но самое большое ускорение возможно при адекватном алгоритме!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.06.2015, 08:58
Помогаю со студенческими работами здесь

Решение системы оду, построение графиков и оптимизация кода
Есть система, представленная в м-файле.Грубо говоря,а1..а8 меняются от концентрации лекарства,т.е.: кон=0|кон=0,03| кон=0,3 ...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока кода/отдельной функции или процедуры/программы...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был создан миф. Это миф о цветовой индефикации...

Оптимизация кода
Есть кусок кода: public static void NOCH (object source, ElapsedEventArgs e) { try { ...

Оптимизация кода
Покритикуйте, если не сложно. А еще очень интересно, как теперь это сделать в виде приложения на компьютер, а не консольной программы. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru