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

 

Все оказалось именно так, как описано в документации!

Функция rmatrixsvd- "честная"!

Вопрос как проверять ее саму более не актуален- проверил, работает.

Собственно, проверка заключается в сравнении исходной матрицы

с произведением U x S x Vt.

.

Диагональные матрицы тоже проверил, все возможные размеры строки 3..10 - столбцы 3..10.

Поставил достаточно жесткую проверку на разницу исходной матрицы и восстановленной:

double delta = arr(row, col) - usRvt(row, col);
if(delta > 0.00000000001)  { throw "Плохо все"; }

У меня такое условие ни разу не сработало.

.

Отправил в личку сообщение.

 

Отлично!!!

Отправил в личку сообщение.

 
boysn >>:

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


Если же квадратная матрица достаточно большая, скажем 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 строк.

Вы уверены, что матрица 1000х1000 будет у Вас невырожденной (не бессмысленной)?

https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

Дело в том, что на реальных неслучайных данных при миллионе отсчётов, то есть 1000х1000 между данными часто и явно прослеживается линейная зависимость и матрица теряет смысл. Это не значит, что задач с матрицами 1000х1000 не бывает, лично я знаю несколько реальных многостадийных алгоритмов, например целочисленной оптимизации, где для решения задачи специально составляется такая большая матрица, иначе задачу не решить, то есть решается за счёт увеличения размерности. Такая большая матрица делается искусственно, её сегменты представляют собой фактически разные варианты задач, то есть вряд ли линейно зависимые.

Прежде чем ваять проги надо ответить на вопрос: Вы уверены что Ваша матрица 1000х1000 не вырожденная?

 
AlexEro писал(а) >>

Вы уверены, что матрица 1000х1000 будет у Вас невырожденной (не бессмысленной)?

https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

Дело в том, что на реальных неслучайных данных при миллионе отсчётов, то есть 1000х1000 между данными часто и явно прослеживается линейная зависимость и матрица теряет смысл. Это не значит, что задач с матрицами 1000х1000 не бывает, лично я знаю несколько реальных многостадийных алгоритмов, например целочисленной оптимизации, где для решения задачи специально составляется такая большая матрица, иначе задачу не решить, то есть решается за счёт увеличения размерности. Такая большая матрица делается искусственно, её сегменты представляют собой фактически разные варианты задач, то есть вряд ли линейно зависимые.

Прежде чем ваять проги надо ответить на вопрос: Вы уверены что Ваша матрица 1000х1000 не вырожденная?

Посмотрим, там видно будет...

 
jartmailru писал(а) >>

Отправил в личку сообщение.

Отлично!!!

Отправил в личку сообщение.

 

Не получается импортировать DLL. (((

В MS Visual C++ написал DLL:

//MyDll.h

#define MY_EXPORT extern "C" __declspec ( dllexport )
MY_EXPORT int CALLBACK Return1();

//MyDll.cpp

MY_EXPORT int CALLBACK Return1() { return 1; }

//MyDll.def

LIBRARY "MyDll"

EXPORTS Return1 @1

После компиляции получил MyDll.dll и MyDll.lib

Также написал микро прогу на C++ использующую DLL. В настройках проекта указал MyDll.lib. Она нормально работает с DLL.

Далее попробовал импорт DLL из MT4, положив в директорию experts\libraries файл MyDll.dll. В документации ничего про *.lib я не нашел поэтому его не клал.
//ImportDll.mqh (в директории experts\include)
#import "MyDll.dll"

int Return1();

//ImportDll.mq4 (в директории experts\indicators)
#include <ImportDll.mqh>
int init()

{

Print("Return1="+Return1());

return (0);
}

При запуске ImportDll.ex4 пришет: dll calls are not allowed; 'MyDll.dll' - 'Return1'
ПОМОГИТЕ .... я уже мосх сломал ((((((((((((((((((((((((( Мой ICQ: 573794562, e-mail: AKalashnikov84@mail.ru.


Причина обращения: