Форум программистов, компьютерный форум, киберфорум
Наши страницы
Matlab
Войти
Регистрация
Восстановить пароль
 
kRosis
186 / 191 / 43
Регистрация: 13.05.2013
Сообщений: 708
1

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

01.06.2015, 01:38. Просмотров 289. Ответов 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
Миниатюры
Оптимизация кода  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2015, 01:38
Ответы с готовыми решениями:

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

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

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

Оптимизация цикла
Есть такой код: % Генерация точек в объеме N=20 for i=(1:N) ...

Оптимизация в MATLAB
Суть задачи -найти массив V и Т при заданных ограничениях -0.05*A&lt;V&lt;0.05*A и параметр D -&gt; 0....

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

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

Но самое большое ускорение возможно при адекватном алгоритме!
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2015, 08:58

Условная оптимизация
Нужно найти a,b и h при том, что pi*a^2 + 1.5*sqrt(h^2-(b-a)^2)*/2=min pi*h(b^2 = a*b + b^2)=10...

Оптимизация программы
Написал функцию к программе, для определения нужного коэффициента. Она работает, но очень долго...

Оптимизация функции
Всем привет! Начал вспоминать(осваивать) Matlab, последний раз имел дело лет 10 назад в универе. ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru