Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 26.04.2011
Сообщений: 9
.NET 4.x

Взаимодействие с библиотекой MATLAB (аппроксимация кривой по гауссу)

01.07.2012, 11:44. Показов 3164. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Написал я программу, в которой с помощью библиотеки матлаб проходит аппроксимация кривой по гауссу, лоренцу или суперпозиции гаусса и лоренца. И вот есть один ньюанс, который меня очень огорчает. Когда в программе первый раз доходит до аппроксимации, то начинается великая тупка, в это время смотрю в диспетчере задач, программа бешено подгружает что-то в оперативку, доходит до 1Гб с лишним, потом сбрасывается примерно на 100 метров и опять в верх бежит и так раз 5. А когда эта тупка проходит, то последующая аппроксимация выполняется достаточно быстро. Сколько раз не запускаю, все шустренько работает. Ну и следовательно возникает вопрос, можно как-то ускорить этот процесс? Или хотябы сделать так, чтобы программа долго думала только при загрузке, а то так возникает ощущение что программа зависает, во время выполнения аппроксимации.
Ниже привожу код функции на матлабе, в которой выполняется аппроксимация и С# кусок кода в котором вызывается эта аппроксимация.

Matlab M
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function [xc1 xc2] = gauss( y, A1, A2, W1, W2, Xc1, Xc2, Yo1, Yo2)
%Find centr of Gaussian
%   xc=gauss(y,x); xc - centrs; y - input function; x - argumenti [A1, A2, W1, W2, Xc1, Xc2, Yo1, Yo2].
x=1:length(y);
x1=1:Xc1(2); x2=Xc2(1)+1:length(y);
y1(x1)=y(x1); y2(1:length(x2))=y(x2);
x=x'; x1=x1'; x2=x2';
y1=y1'; y2=y2';
ftype = fittype('Yo + (A/(W*sqrt(pi/2)))*exp(-2*((x-xc)/W).^2)');
opts = fitoptions('Method','NonlinearLeastSquares','Lower',[A1(1) W1(1) Yo1(1) Xc1(1)],'Upper',[A1(2) W1(2) Yo1(2) Xc1(2)]);
opts2 = fitoptions('Method','NonlinearLeastSquares','Lower',[A2(1) W2(1) Yo2(1) Xc2(1)],'Upper',[A2(2) W2(2) Yo2(2) Xc2(2)]);
[FO1 G1 O1] = fit(x1,y1,ftype, opts);
coef1=coeffvalues(FO1);
confint1 = confint(FO1);
[FO2 G2 O2] = fit(x2,y2,ftype, opts2);
coef2=coeffvalues(FO2);
confint2 = confint(FO2);
xc1={G1, O1, coef1, confint1};
xc2={G2, O2, coef2, confint2};
end
C#
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
private Centrs Fitting()
        {
            FitCurve fitCurve = new FitCurve();
            positionMatrixYFit = new double[positionMatrixY.Length];
            Centrs newCentrs = new Centrs();
            newCentrs.koef = new double[2,4];
            newCentrs.rsquare = new double[2];
            newCentrs.rmse = new double[2];
            newCentrs.xcIntreval = new double[2];
            MWArray[] Y = null;
            if (a1[0] < 0 | a1[1] <= 0 | a2[0] < 0 | a2[1] <= 0 | w1[0] < 0 | w1[1] <= 0 | w2[0] < 0 | w2[1] <= 0 | 
                xc1[0] < 0 | xc1[1] < 0 | xc2[0] < 0 | xc2[1] < 0 | xc1[0] == xc2[0] | xc1[1] == xc2[1])
            {
                throw new ArgumentException("Неверные значения граничных переменных для функции аппроксимации");
            }
            switch (method)
            {
            case FittingMethod.gauss:
                Y = (MWArray[])fitCurve.gauss(2, (MWNumericArray)positionMatrixY, (MWNumericArray)a1, (MWNumericArray)a2,
                    (MWNumericArray)w1, (MWNumericArray)w2, (MWNumericArray)xc1, (MWNumericArray)xc2, (MWNumericArray)yo1,
                    (MWNumericArray)yo2);
            break;
            case FittingMethod.gauss_lorenz:
                Y = (MWArray[])fitCurve.gauss_lorentz(2, (MWNumericArray)positionMatrixY, (MWNumericArray)a1, (MWNumericArray)a2,
                    (MWNumericArray)w1, (MWNumericArray)w2, (MWNumericArray)xc1, (MWNumericArray)xc2, (MWNumericArray)yo1,
                    (MWNumericArray)yo2);
            break;
            case FittingMethod.lorentz:
                Y = (MWArray[])fitCurve.lorentz(2, (MWNumericArray)positionMatrixY, (MWNumericArray)a1, (MWNumericArray)a2,
                (MWNumericArray)w1, (MWNumericArray)w2, (MWNumericArray)xc1, (MWNumericArray)xc2, (MWNumericArray)yo1,
                (MWNumericArray)yo2);
            break;
            }
            MWCellArray Xc = (MWCellArray)Y[0];
            MWStructArray XcStruct1 = (MWStructArray)Xc[1];
            newCentrs.rsquare[0] = (double)((MWNumericArray)XcStruct1["rsquare"]);
            newCentrs.rmse[0] = (double)((MWNumericArray)XcStruct1["rmse"]);
            if (method != FittingMethod.gauss_lorenz)
            {
                newCentrs.koef[0, 0] = (double)((MWNumericArray)Xc[3][1]);
                newCentrs.koef[0, 1] = (double)((MWNumericArray)Xc[3][2]);
                newCentrs.koef[0, 2] = (double)((MWNumericArray)Xc[3][3]);
                newCentrs.koef[0, 3] = (double)((MWNumericArray)Xc[3][4]);
                if (!(((MWNumericArray)Xc[4])[8].IsNaN))
                    newCentrs.xcIntreval[0] = (double)((MWNumericArray)Xc[4])[8] - newCentrs.koef[0, 3];
                else
                    newCentrs.xcIntreval[0] = 0;
            }
            if (method == FittingMethod.gauss_lorenz)
            {
                newCentrs.koef = new double[2,6];
                newCentrs.koef[0, 0] = (double)((MWNumericArray)Xc[3][1]);
                newCentrs.koef[0, 1] = (double)((MWNumericArray)Xc[3][3]);
                newCentrs.koef[0, 2] = (double)((MWNumericArray)Xc[3][5]);
                newCentrs.koef[0, 3] = (double)((MWNumericArray)Xc[3][6]);
                newCentrs.koef[0, 4] = (double)((MWNumericArray)Xc[3][2]);
                newCentrs.koef[0, 5] = (double)((MWNumericArray)Xc[3][4]);
                if (!(((MWNumericArray)Xc[4])[8].IsNaN))
                    newCentrs.xcIntreval[0] = (double)((MWNumericArray)Xc[4])[12] - newCentrs.koef[0, 3];
                else
                    newCentrs.xcIntreval[0] = 0;
            }
            Xc = (MWCellArray)Y[1];
            XcStruct1 = (MWStructArray)Xc[1];
            newCentrs.rsquare[1] = (double)((MWNumericArray)XcStruct1["rsquare"]);
            newCentrs.rmse[1] = (double)((MWNumericArray)XcStruct1["rmse"]);
            if (method != FittingMethod.gauss_lorenz)
            {
                newCentrs.koef[1, 0] = (double)((MWNumericArray)Xc[3][1]);
                newCentrs.koef[1, 1] = (double)((MWNumericArray)Xc[3][2]);
                newCentrs.koef[1, 2] = (double)((MWNumericArray)Xc[3][3]);
                newCentrs.koef[1, 3] = (double)((MWNumericArray)Xc[3][4]);
                if (!(((MWNumericArray)Xc[4])[8].IsNaN))
                    newCentrs.xcIntreval[1] = (double)((MWNumericArray)Xc[4])[8] - newCentrs.koef[1, 3];
                else
                    newCentrs.xcIntreval[1] = 0;
            }
            if (method == FittingMethod.gauss_lorenz)
            {
                newCentrs.koef[1, 0] = (double)((MWNumericArray)Xc[3][1]);
                newCentrs.koef[1, 1] = (double)((MWNumericArray)Xc[3][3]);
                newCentrs.koef[1, 2] = (double)((MWNumericArray)Xc[3][5]);
                newCentrs.koef[1, 3] = (double)((MWNumericArray)Xc[3][6]);
                newCentrs.koef[1, 4] = (double)((MWNumericArray)Xc[3][2]);
                newCentrs.koef[1, 5] = (double)((MWNumericArray)Xc[3][4]);
                if (!(((MWNumericArray)Xc[4])[8].IsNaN))
                    newCentrs.xcIntreval[1] = (double)((MWNumericArray)Xc[4])[12] - newCentrs.koef[1, 3];
                else
                    newCentrs.xcIntreval[1] = 0;
            }
            
 
            switch (method)
            {
                case FittingMethod.gauss:
                    for (int i = 0; i < Xc1[1]; i++)
                        positionMatrixYFit[i] = (newCentrs.koef[0, 2] + newCentrs.koef[0, 0] / (newCentrs.koef[0, 1] * Math.Sqrt(Math.PI / 2))) * Math.Exp(-2 * Math.Pow(((i - newCentrs.koef[0, 3]) / newCentrs.koef[0, 1]), 2));
                    for (int i = Convert.ToInt32(Xc1[1]); i < PositionMatrixY.Length; i++)
                        positionMatrixYFit[i] = (newCentrs.koef[1, 2] + newCentrs.koef[1, 0] / (newCentrs.koef[1, 1] * Math.Sqrt(Math.PI / 2))) * Math.Exp(-2 * Math.Pow(((i - newCentrs.koef[1, 3]) / newCentrs.koef[1, 1]), 2));
                    break;
                case FittingMethod.gauss_lorenz:
                    for (int i = 0; i < Xc1[1]; i++)
                        positionMatrixYFit[i] = newCentrs.koef[0, 2] + (newCentrs.koef[0, 0] / (newCentrs.koef[0, 1] * Math.Sqrt(Math.PI / 2))) * Math.Exp(-2 * Math.Pow(((i - newCentrs.koef[0, 3]) / newCentrs.koef[0, 1]), 2)) + (2 * newCentrs.koef[0, 4] * newCentrs.koef[0, 5]) / (Math.PI * 4 * Math.Pow((i - newCentrs.koef[0, 3]), 2) + Math.Pow(newCentrs.koef[0, 5], 2));
                    for (int i = Convert.ToInt32(Xc1[1]); i < PositionMatrixY.Length; i++)
                        positionMatrixYFit[i] = newCentrs.koef[1, 2] + (newCentrs.koef[1, 0] / (newCentrs.koef[1, 1] * Math.Sqrt(Math.PI / 2))) * Math.Exp(-2 * Math.Pow(((i - newCentrs.koef[1, 3]) / newCentrs.koef[1, 1]), 2)) + (2 * newCentrs.koef[1, 4] * newCentrs.koef[1, 5]) / (Math.PI * 4 * Math.Pow((i - newCentrs.koef[1, 3]), 2) + Math.Pow(newCentrs.koef[1, 5], 2));
                    break;
                case FittingMethod.lorentz:
                    for (int i = 0; i < Xc1[1]; i++)
                        positionMatrixYFit[i] = newCentrs.koef[0, 2] + (2 * newCentrs.koef[0, 0] * newCentrs.koef[0, 1]) / (Math.PI * 4 * Math.Pow((i - newCentrs.koef[0, 3]), 2) + Math.Pow(newCentrs.koef[0, 1], 2));
                    for (int i = Convert.ToInt32(Xc1[1]); i < PositionMatrixY.Length; i++)
                        positionMatrixYFit[i] = newCentrs.koef[1, 2] + (2 * newCentrs.koef[1, 0] * newCentrs.koef[1, 1]) / (Math.PI * 4 * Math.Pow((i - newCentrs.koef[1, 3]), 2) + Math.Pow(newCentrs.koef[1, 1], 2));
                    break;
            }
 
            return newCentrs;
        }
Долго думает программа при первом вхождении в строку:
C#
1
2
3
Y = (MWArray[])fitCurve.gauss(2, (MWNumericArray)positionMatrixY, (MWNumericArray)a1, (MWNumericArray)a2,
                    (MWNumericArray)w1, (MWNumericArray)w2, (MWNumericArray)xc1, (MWNumericArray)xc2, (MWNumericArray)yo1,
                    (MWNumericArray)yo2);
Заранее спасибо за помощь.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.07.2012, 11:44
Ответы с готовыми решениями:

Аппроксимация кривой
Здравствуйте. Есть данные, которые необходимо аппроксимировать при помощи функции, определить коэффициенты аппроксимации. Функция: \psi...

Аппроксимация кривой касательно к дуге
Доброго времени суток. Прошу вашей помощи. Имеется координаты точек некоторой кривой. Точки заданы с некоторой погрешностью. Необходимо...

Аппроксимация экспериментальной кривой в матлабе
Здравствуйте! У меня такая задача, есть экспериментальные данные типа: &gt;&gt; x= &gt;&gt; y= *по ним построен график и его нужно аппроксимировать в...

3
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
03.07.2012, 08:07
Пробуй выделений памяти контролировать, пробуй частями как то исполнять код и смотри что конкретно съедает память, контролируй запуски сборки мусора и сопоставляй факты, используй точки останова. У студии много способов заглянуть внутрь процесса.
0
0 / 0 / 0
Регистрация: 26.04.2011
Сообщений: 9
03.07.2012, 15:39  [ТС]
Я нашел на какой строчке кода подвисает все. Дальше ничего не умею)) Можно как-то по подробнее объяснить, что сделать можно? Единственный выход, который я щас вижу, это при загрузке программы вызвать эту же аппроксимацию, но с пустыми параметрами например. Тогда при загрузке один раз программа потупит на splashscreen например. Но это же очень кривой выход))
0
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
03.07.2012, 17:50
Честно говоря листинг MATLAB для меня филькина грамота и тем более далёк от масштаба алгоритма обработки, вряд ли кто то по своему желанию станет разбирать вашу проблему по косточкам, тут только методом проб и анализа.
Если можно снизить нагрузку на память искусственным способом, сделайте это и посмотрите на нагрузку, а может быть так и должно быть и надо в отдельном потоке или потоках выполнять определённые действия. В студии есть меню анализ, пошарьте там, может какие то моменты прояснятся.
Возможно MATLAB поднимает какие то неуправляемые ресурсы и есть функция очистки, но это всего лишь предположение.
В общем вывод такой, сужайте круг проблем и тогда возможно всё вернётся к теме форума - то есть обсуждение языка сишарп, а на данном этапе всё довольно мутно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2012, 17:50
Помогаю со студенческими работами здесь

Аппроксимация кривой намагничивания гиперболическим синусом
Здравствуйте. Есть кривая намагничивания заданная массивом. Необходимо аппроксимировать ее с помощью кубического сплайна и гиперболического...

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

Аппроксимация в matlab
Здравствуйте! Не могли бы помочь, нужно выполнить аппроксимацию в matlab(simulink)! Есть кривая разгона (график) и функция описывающая...

Аппроксимация методом наименьших квадратов без polyfit [matlab]
Здравствуйте! Знаю, что на форуме подробна разобрана эта проблема, но мой вопрос состоит в следующем.. Если не использовать функцию...

Найти все точки кривой, принадлежащие диапазону / matlab
Здравствуйте! Есть кривая curve, и есть диапазон значений Нужно найти все точки , принадлежащие этой кривой, внутри данного...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru