Ajuda a resolver um problema de importação de uma função a partir de uma dll - página 10
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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.
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?
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...
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