Ajuda a resolver um problema de importação de uma função a partir de uma dll - página 10

 

Aconteceu exatamente como descrito na documentação!

A função rmatrixsvd é "honesta"!

A questão de como verificá-la em si não é mais relevante - eu a verifiquei, ela funciona.

Na verdade, a verificação consiste em comparar a matriz da fonte

com o produto U x S x Vt.

.

Matrizes diagonais verificadas também, todos os tamanhos de linha possíveis 3...10 - tamanhos de coluna 3...10.

Eu coloquei uma verificação bastante rigorosa na diferença entre a matriz original e a matriz reconstruída:

double delta = arr(row, col) - usRvt(row, col);
if(delta > 0.00000000001) { jogue "Bad everything"; }

Esta condição nunca funcionou para mim.

.

Enviou-me uma mensagemem uma mensagemprivada.

 

Ótimo!!!

Enviou-me uma mensagemem meu e-mailpessoal.

 
boysn >> :

OK, deixe-me tentar explicar...


Se uma matriz quadrada é suficientemente grande, digamos 1000x1000, então encontrar todos os valores próprios via bissecções é ineficiente e aqui entra em jogo o princípio dos modernos algoritmos de decomposição singular: reduzindo a matriz a uma forma bidiagonal seguida de diagonalização pelo algoritmo QR. Este é o texto que eu trago do site http://alglib.sources.ru/. Além disso, há a seguinte frase: Este esquema simples é bastante operável, mas pode ser melhorado fazendo uma adição que aumentará notavelmente a velocidade do programa. O esquema do algoritmo melhorado descrito abaixo é quase completamente emprestado do pacote LAPACK (sub-rotina xGESVD). Uma descrição completa do algoritmo: http://alglib.sources.ru/matrixops/general/svd.php

Isto é, para minhas tarefas eu preciso de um algoritmo rápido, trabalhando com matrizes grandes de 1000x1000 ou até mais... e eu preciso exatamente TODOS os valores singulares junto com vetores, isto é, expansão total. Foi por isso que me instalei na biblioteca http://alglib.sources.ru/. Especialmente, uma vez que já existe algum código C++ pronto para uso. Há um algoritmo para 300 linhas de código, mas é mais lento que 3000 linhas de código.

Você tem certeza de que você terá uma matriz 1000x1000 não individual (não sem sentido)?

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

A questão é que dados reais não aleatórios com um milhão de amostras, ou seja, 1000x1000, muitas vezes e claramente mostram uma dependência linear entre os dados e a matriz perde seu significado. Pessoalmente conheço vários algoritmos reais de otimização de múltiplas etapas, por exemplo, de otimização inteira onde uma matriz tão grande é criada especificamente para resolver um problema porque o problema não pode ser resolvido de outra forma, ou seja, o problema é resolvido através do aumento de sua dimensionalidade. Uma matriz tão grande é feita artificialmente; seus segmentos representam na verdade diferentes variantes de problemas, ou seja, dificilmente são linearmente dependentes.

Antes de fazer um programa, você deve responder à pergunta: você tem certeza de que sua matriz 1000x1000 não está degenerada?

 
AlexEro писал(а) >>

Você tem certeza de que você terá uma matriz 1000x1000 que não é de linha (não sem sentido)?

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

A questão é que dados reais não aleatórios com um milhão de amostras, ou seja, 1000x1000, muitas vezes e claramente mostram uma relação linear entre os dados e a matriz perde seu significado. Pessoalmente conheço vários algoritmos reais de otimização de múltiplas etapas, por exemplo, de otimização inteira onde uma matriz tão grande é criada especificamente para resolver um problema porque o problema não pode ser resolvido de outra forma, ou seja, o problema é resolvido através do aumento de sua dimensionalidade. Uma matriz tão grande é feita artificialmente; seus segmentos representam na verdade diferentes variantes de problemas, ou seja, dificilmente são linearmente dependentes.

Antes de fazer um programa, você deve responder à pergunta: você tem certeza de que sua matriz de 1000x1000 não está degenerada?

Vamos ver, vamos ver...

 
jartmailru писал(а) >>

Enviei uma mensagem para você em uma mensagem particular.

Ótimo!!!

>> Enviamos-lhe uma mensagem particular.

 

Não é possível importar a DLL. (((

Em MS Visual C++ escrevi uma DLL:

//MyDll.h

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

//MyDll.cpp

MY_EXPORT int CALLBACK Return1() { return 1; }

//MyDll.def

BIBLIOTECA "MyDll

EXPORTAÇÕES Retorno1 @1

Após a compilação, recebi MyDll.dll e MyDll.lib.

Também escreveu um micro-prog em C++ usando DLL. MyDll.lib foi especificado nas configurações do projeto. Funciona bem com DLL.

Depois tentei importar DLL do MT4, colocando o arquivo MyDll.dll no diretório experts\libraries. Eu não encontrei nada sobre *.lib na documentação, então não a coloquei lá.
//ImportDll.mqh (no diretório expert\include)
#importar "MyDll.dll"

int Return1();

//ImportDll.mq4 (no diretório experts\indicators)
#include <ImportDll.mqh>
int init()

{

Imprimir("Return1="+Return1();

retorno("0);
}

Ao rodar ImportDll.ex4 diz: chamadas dll não são permitidas; 'MyDll.dll' - 'Return1'
HELP .... Já quebrei meu cérebro ((((((((((((((((((((((((( Meu ICQ: 573794562, e-mail: AKalashnikov84@mail.ru