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

 

М... Sim... isso é uma chatice... com programação C++ em Bilder... Cara, muitos erros de novo :'-(

:-) esta decomposição svd já me consumiu tanto tempo, e parece que não há fim à vista.

Desculpe a imodéstia da pergunta, mas você poderia fazer o trabalho por uma N-ésima taxa?

Honestamente, estou ficando cansado de lutar contra isso... Estou neste fórum desde 2 de setembro, e o quanto tenho lutado antes disso... Oooh...

É claro que estudarei C++ no futuro, mas isso levará algum tempo.

Realmente esperando por sua ajuda.

 

Esta é a singular função de transformação do klot:

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

>> jejum nulo( duplo X[],int n,int l,int s,duplo &Y[])

Eu não entendo bem que tipo de cálculos você quer fazer

com matrizes bidimensionais.

.

Tente descrever o problema.

Se isso fizer sentido para mim, eu o ajudarei.

.

Preciso ver passo a passo:

Preencha uma matriz 3 por 3 com isso, envie-a para isso,

devemos conseguir algo.

A mudança para matrizes maiores é uma questão de técnica.

 
Perdoe minha imodéstia, mas você seria capaz de fazer o trabalho por uma N-ésima taxa? <br / translate="no">

Boa pergunta :-).

 

OK, deixe-me tentar explicar...

Eu estava olhando para o código MQL da klot. No início, quando encontrei o link, fiquei muito feliz, mas depois de entender o código e pensar no que eu quero, percebi que não é exatamente o que eu quero...

É uma busca baseada em bisseções de números próprios. Depois de ler alguma literatura, entendi que este algoritmo é bom quando encontramos apenas uma parte de todos os valores próprios possíveis.

Mas se uma matriz quadrada é bastante grande, digamos, 1000x1000, encontrar todos os valores próprios através de bissecções é ineficiente e é aqui que entra em jogo o princípio dos algoritmos modernos de decomposição singular - levando uma matriz a uma forma bidiagonal seguida de sua 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). Descrição completa do algoritmo: http://alglib.sources.ru/matrixops/general/svd.php

Isto é, para minhas tarefas preciso de um algoritmo rápido, trabalhando com matrizes grandes de 1000x1000 ou até mais... e preciso exatamente TODOS os valores singulares junto com vetores, ou seja, decomposiçã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á ali um algoritmo de 300 linhas, mas é mais lento que o código de 3000 linhas. No início eu tentei aprender como trabalhar com dll, para que eu pudesse compilar minha própria dll mais tarde, ela não funcionou. Depois tentei reescrevê-lo de C++ para MQL, mas também me pareceu bastante difícil para mim descobrir o algoritmo e traduzi-lo para outro idioma. Depois disso decidi voltar para dll através do fórum e pedir ajuda aos profissionais, porque esta versão parece ser mais universal, não acha? Além disso, segundo entendi, a MQL5 está prestes a ser lançada. Não se sabe qual será a compatibilidade com a MQL4. Portanto, provavelmente seria melhor implementar a idéia através de uma dll. Gostaria de saber sua opinião sobre este assunto.

Como a dimensionalidade da matriz quadrada será desconhecida na entrada, sugiro que a matriz bidimensional seja implementada como uma matriz unidimensional, e uma vez que a dimensionalidade seja conhecida, use a função ArrayResize para preenchê-la. E esse seria o input. Depois é convertido para ap::real_2d_array para entrada em rmatrixsvd. Há ali um método:

set boundsvazios (int iLow1, int iHigh1, int iLow2, int iHigh2)
Alocação de memória para a matriz. Isto remove o conteúdo da matriz antiga e libera a memória que foi alocada para ela, depois aloca uma nova área de memória separada com o tamanho de (iHigh1-iLow1+1)*(iHigh2-iLow2+1) elementos.
A numeração dos elementos da nova matriz pela primeira dimensão começa com iLow1 e termina com iHigh1, de forma semelhante para a segunda dimensão.
O conteúdo da nova matriz é indefinido.

Ou seja, acho que é um método muito conveniente, quando o tamanho da matriz não é conhecido de antemão pela 1ª ou 2ª dimensão.

Então a própria função rmatrixsvd deve ser calculada que produz e dá números singulares e vetores singulares em matrizes bidimensionais, que também são convertidas em matrizes unidimensionais e já exportadas em MQL para processamento posterior.

Isso parece ser tudo. Acho que não esqueci nada.

 

É claro, você realmente quer trabalhar com uma variante difícil.

.

Você disse que tem um caso de teste.

Na qual você precisa preencher uma matriz 3 por 3.

E você sabe o resultado.

.

Agora você vai me dizer o que é suposto ir

para a função rmatrixsvd e o que ela deve produzir.

.

Eu quero números específicos.

 

Exemplos

Embora provavelmente seja melhor usar o segundo exemplo para verificar. No primeiro, são contados os números próprios. Mas, em princípio, logicamente, se colocarmos lá uma matriz 3x3, devemos ter raízes de números próprios na diagonal, ou seja, valores singulares, em ordem decrescente

Arquivos anexados:
jgdwni.rar  18 kb
 

Você poderia, em princípio, procurar outros exemplos para verificar... Se estes exemplos não o satisfizerem, procurarei outros exemplos. Para que saibamos com certeza que o algoritmo funciona corretamente.

 

A partir da descrição do svd.cpp:

Parâmetros de saída:
W - contém valores singulares ordenados em ordem decrescente.
U - se UNeeded=0, não muda. Vetores singulares à esquerda
não são calculados.
se UNeeded=1, contém vetores singulares à esquerda (os primeiros
colunas min(M,N) da matriz U). Uma matriz com elementos numerados
[0...M-1, 0...Min(M,N)-1].
se UNeeded=2, contém a matriz U completa. Uma matriz com elementos numerados [0.
Matriz numerada de elementos [0...M-1, 0...M-1].
VT - se VTNeeded=0, não é alterado. Os vetores singulares certos
não são calculados.
se VTNeeded=1, ele contém os vetores singulares corretos
(as primeiras fileiras min(M,N) da matriz V^T). A matriz com numeração
de elementos [0...min(M,N)-1, 0...N-1].
se VTNeeded=2, contém a matriz completa V^T. Array com
numerando os elementos [0...N-1, 0...N-1].

 
Você olha para todos os materiais, descrições, códigos... o escopo do trabalho... e o quanto você acabará por fixar o preço de seu trabalho e nós discutiremos isso com você. Gostaria então de obter o código fonte, além do dll de trabalho acabado.
 
Eu tenho grandes esperanças para você!
Razão: