Помогите разобраться в проблеме импорта функции из dll - страница 9

 

М... да уж... тоска зелёная... с программированием на С++ в Билдере... Блин, опять куча ошибок :'-(

:-) столько уже времени у меня отняло это svd разложение и похоже конца края не видно.

Извиняюь за нескромный вопрос, а Вы бы не смогли бы взяться за эту работу за N-е вознаграждение?

Честно говоря, утомился я уже с ним бороться... Это я на форуме со 2-го сентября, а сколько я ещё до этого бился... Уууу...

В перспективе, конечно, буду С++ изучать, но на это надо время.

Очень надеюсь на Вашу помощь.

 

Вот какая функция сингулярного преобразования была у klot'а:

в https://www.mql5.com/ru/code/7359

>> void fastsingular( double X[],int n,int l,int s,double &Y[])

Я не совсем понимаю, что за вычисления Вы хотите делать 

с 2-мерными матрицами.

.

Попробуйте описать задачу. 

Если мне все будет понятно, то я Вам помогу.

.

Мне нужно увидеть пошагово: 

заполняем матрицу 3 на 3 тем-то, посылаем туда-то,

должны получить то-то.

Перейти к матрицам большего размера- дело техники.

 
Извиняюь за нескромный вопрос, а Вы бы не смогли бы взяться за эту работу за N-е вознаграждение?

Вопрос хороший :-).

 

Ок, сейчас попробую объяснить...

Я смотрел код на MQL у klot'а. Сначала когда нашёл ссылку, то очень обрадовался, но разобравшись с кодом и поразмыслив чего я хочу, понял, что это не совсем то...

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

Если же квадратная матрица достаточно большая, скажем 1000х1000, то нахождение всех собственных значений через бисекции неэффективен и тут выходит на первое место принцип работы современных алгоритмов сингулярного разложения: приведение матрицы к двухдиагональной форме с последующей её диагонализацией QR-алгоритмом. Это я привожу текст с сайта http://alglib.sources.ru/. Далее идет такая фраза: Эта простая схема вполне работоспособна, однако в неё можно внести дополнение, заметно повышающее быстродействие программы. Схема улучшенного алгоритма, описанная ниже, практически полностью позаимствована из пакета LAPACK (подпрограмма xGESVD). Полное описание алгоритма: http://alglib.sources.ru/matrixops/general/svd.php

Т.е. для моих задач нужен быстрый алгоритм, работающий с большими матрицами порядка 1000х1000, может и более.. и мне нужны именно ВСЕ сингулярные значения вместе с векторами, т.е. полное разложение. Поэтому я остановился на библиотеке http://alglib.sources.ru/. Тем более, что там уже есть готовый код на С++. Там есть алгоритм на 300 строк кода, но он более медленный, чем код на 3000 строк. Сначала я попытался научиться работать с dll, чтобы потом скомпоновать собственную dll, не получилось. Потом попытался переписать с С++ на MQL, но тоже оказалось для меня достаточно сложно разобраться в алгоритме, да ещё перенести его на другой язык. Потом опять решил всё-таки вернуться к dll уже через форум и попросить помощи у знатоков, так как этот вариант всё таки, как мне кажется, более универсальный, как Вы считаете? Тем более, как я понял, скоро выйдет в свет MQL5. Неизвестно ещё какая будет совместимость с MQL4. Поэтому, всё-таки, наверное, лучше всё это реализовать через dll. Хотелось бы услышать Ваше мнение на этот счет.

Т.к. на входе заранее будет неизвестна размерность квадратной матрицы, то, как я понимаю, лучше 2-мерную матрицу иметь как одномерную и когда будет известна размерность, то воспользоваться функцией ArrayResize, заполнить его. И это будет вход. Далее она конвертируется в ap::real_2d_array для входа в rmatrixsvd. Там есть метод:

void setbounds(int iLow1, int iHigh1, int iLow2, int iHigh2)
Выделение памяти под массив. При этом старое содержимое массива удаляется и освобождается выделенная под него память, затем заново выделяется отдельная область памяти размером (iHigh1-iLow1+1)*(iHigh2-iLow2+1) элементов.
Нумерация элементов в новом массива по первой размерности начинается с iLow1 и заканчивается iHigh1, аналогично для второй размерности.
Содержимое нового массива не определено.

Т.е., я считаю очень удобный на мой взгляд метод, когда заранее неизвестен размер массива ни по 1-му, ни по 2-му измерению.

Далее должен идти расчет самой функции rmatrixsvd, которая на выходе и дает и сингулярные числа и сингулярные вектора в 2-мерных матрицах, которые тоже переводятся в одномерные и уже экспортируются в MQL для дальнейшей обработки.

Вот, кажется, и всё. По-моему, ничего не забыл.

 

Все понятно, Вы действительно хотите работать со сложным вариантом.

.

Вы говорили, что у Вас есть тестовый пример.

В котором нужно заполнить матрицу 3 на 3.

И известен результат.

.

Вы мне сейчас скажИте, что должно пойти 

на вход функции rmatrixsvd, и что она должна выдать.

.

Мне нужны конкретные числа.

 

Примеры

Хотя, наверно, лучше для проверки использовать второй пример. А в первом считаются собственные числа. Но в принципе по логике, если загнать туда матрицу 3х3, то должны получиться на диагонали корни из собственных чисел, т.е. сингулярные значения, по убывающей

Файлы:
jgdwni.rar  18 kb
 

Можно, в принципе поискать и другие примеры для проверки... Если эти примеры Вас не удовлетворят, то я займусь поиском других примеров. Чтобы нам точно знать, что алгоритм работает исправно...

 

Из описания svd.cpp:

Выходные параметры:
W - содержит сингулярные значения, упорядоченные по убыванию.
U - если UNeeded=0, не изменяется. Левые сингулярные векторы
не вычисляются.
если UNeeded=1, содержит левые сингулярные векторы (первые
min(M,N) столбцов матрицы U). Массив с нумерацией элементов
[0..M-1, 0..Min(M,N)-1].
если UNeeded=2, содержит полную матрицу U. Массив с нумера-
цией элементов [0..M-1, 0..M-1].
VT - если VTNeeded=0, не изменяется. Правые сингулярные векторы
не вычисляются.
если VTNeeded=1, содержит правые сингулярные векторы
(первые min(M,N) строк матрицы V^T). Массив с нумерацией
элементов [0..min(M,N)-1, 0..N-1].
если VTNeeded=2, содержит полную матрицу V^T. Массив с
нумерацией элементов [0..N-1, 0..N-1].

 
Вы посмотрите все материалы, описания, коды... объем работ... и во сколько Вы в конечном итоге оцените свою работу и мы с Вами это обсудим. Мне бы хотелось потом получить, помимо готовой рабочей dll, и исходники...
 
Очень на Вас надеюсь!