dll에서 함수를 가져오는 문제를 이해하는 데 도움이 됩니다. - 페이지 9

 

M... 네... 녹색 우울... 빌더에서 C++ 프로그래밍으로... 젠장, 또 실수가 많네요 :'-(

:-) 이 svd 분해는 이미 너무 많은 시간이 걸렸고 가장자리의 끝이 보이지 않는 것처럼 보입니다.

무례한 질문을 해서 죄송합니다만 이 일을 N번째 보상으로 받아주시겠습니까?

솔직히 말해서 이미 그와 싸우는 것도 지겹고... 9월 2일부터 포럼에 있었고, 그 전에도 얼마나 싸웠는지... 우우우...

물론 앞으로는 C++도 공부하겠지만, 시간이 걸립니다.

많은 도움이 되기를 바랍니다.

 

다음은 klot의 특이 변환 함수입니다.

https://www.mql5.com/ru/code/7359에서

>> 무효 fastsingular(더블 X[],int n,int l,int s,더블 &Y[])

어떤 계산을 하고 싶은지 잘 모르겠습니다

2차원 행렬로.

.

문제를 설명하려고 합니다.

모든 것이 명확하다면 내가 당신을 도울 것입니다.

.

단계별로 볼 필요가 있습니다.

3 x 3 행렬을 무언가로 채우고 그곳으로 보내세요.

무언가를 얻어야 합니다.

더 큰 행렬로 이동하는 것은 기술의 문제입니다.

 
무례한 질문을 해서 죄송합니다만 이 일을 N번째 보상으로 받아주시겠습니까?

좋은 질문 :-).

 

좋아, 내가 설명하려고 노력할게...

klot의 MQL 코드를 살펴보았다. 처음에는 링크를 찾았을 때 무척 기뻤지만 코드를 정리하고 내가 원하는 것이 무엇인지 곰곰이 생각해 보니 이것이 옳지 않다는 것을 깨달았습니다...

거기에서 고유값을 찾는 것은 이분법을 기반으로 합니다. 일정량의 문헌을 읽은 후 가능한 모든 것 중에서 고유값의 일부만 찾으면 이 알고리즘이 좋다는 것이 분명해졌습니다.

정방 행렬이 충분히 큰 경우(예: 1000x1000) 이등분을 통해 모든 고유값을 찾는 것은 비효율적이며 여기에서 현대 특이값 분해 알고리즘의 작동 원리가 전면에 나옵니다. 행렬을 2대각선으로 축소 QR 알고리즘에 의한 후속 대각화 형식. http://alglib.sources.ru/ 사이트의 텍스트를 인용하고 있습니다. 그 뒤에 다음과 같은 문구가 나옵니다. 이 간단한 구성표는 완벽하게 작동하지만 보완할 수 있어 프로그램 속도를 크게 높일 수 있습니다. 아래에 설명된 개선된 알고리즘의 체계는 LAPACK 패키지(서브루틴 xGESVD)에서 거의 완전히 차용되었습니다. 알고리즘에 대한 전체 설명: http://alglib.sources.ru/matrixops/general/svd.php

저것들. 내 작업을 위해 1000x1000 또는 그 이상 정도의 큰 행렬과 함께 작동하는 빠른 알고리즘이 필요하며 벡터와 함께 정확히 모든 특이값이 필요합니다. 완전한 분해. 따라서 http://alglib.sources.ru/ 라이브러리에 정착했습니다. 게다가 C++에는 이미 기성품 코드가 있습니다. 300줄의 코드에 대한 알고리즘이 있지만 3000줄의 코드보다 느립니다. 처음에는 dll로 작업하는 방법을 배우려고 했으나 나중에 내 자신의 dll을 연결할 수 있도록 했으나 작동하지 않았습니다. 그런 다음 C++에서 MQL로 다시 작성하려고 시도했지만 알고리즘을 이해하고 다른 언어로 옮기는 것조차 상당히 어려운 것으로 나타났습니다. 그런 다음 다시 포럼을 통해 dll로 돌아가 전문가에게 도움을 요청하기로 결정했습니다. 이 옵션은 여전히 보편적이기 때문에 어떻게 생각하십니까? 또한 MQL5가 곧 출시될 예정입니다. MQL4와의 호환성은 아직 알려지지 않았습니다. 따라서 결국 dll을 통해 이 모든 것을 구현하는 것이 더 나을 것입니다. 이 문제에 대한 귀하의 의견을 듣고 싶습니다.

왜냐하면 입력 시 정사각 행렬의 차원은 미리 알 수 없으므로 이해하기로는 2차원 행렬을 1차원으로 갖는 것이 좋으며 차원을 알면 다음을 사용합니다. ArrayResize 함수를 채우십시오. 그리고 이것은 입구가 될 것입니다. 그런 다음 ap::real_2d_array로 변환되어 rmatrixsvd로 들어갑니다. 거기에는 다음과 같은 방법이 있습니다.

무효 setbounds( int iLow1, int iHigh1, int iLow2, int iHigh2)
배열에 메모리를 할당합니다. 동시에 배열의 기존 내용을 삭제하고 할당된 메모리를 해제한 다음 (iHigh1-iLow1+1)*(iHigh2-iLow2+1) 요소 크기의 별도 메모리 영역을 다시 할당합니다. 할당됨.
첫 번째 차원에 의한 새 배열의 요소 번호 매기기는 두 번째 차원과 유사하게 iLow1에서 시작하여 iHigh1로 끝납니다.
새 배열의 내용이 정의되지 않았습니다.

즉, 1차원에서도 2차원에서도 배열의 크기를 미리 알 수 없을 때 이 방법이 매우 편리하다고 생각합니다.

다음으로 rmatrixsvd 함수 자체를 계산해야 합니다. 이 함수는 출력에서 2차원 행렬의 특이 수와 특이 벡터를 모두 제공합니다. 이 함수도 1차원으로 변환되고 추가 처리를 위해 이미 MQL로 내보내집니다.

그것이 전부인 것 같습니다. 나는 아무것도 잊었다고 생각하지 않는다.

 

모든 것이 명확합니다. 복잡한 옵션으로 작업하고 싶습니다.

.

테스트 케이스가 있다고 하셨습니다.

3x3 행렬을 채워야 합니다.

그리고 그 결과는 알려져 있습니다.

.

당신은 지금 무엇을 가야하는지 말해

rmatrixsvd 함수의 입력과 생성해야 하는 것.

.

구체적인 숫자가 필요합니다.

 

그러나 확인을 위해 두 번째 예를 사용하는 것이 더 나을 것입니다. 그리고 먼저 자신의 숫자가 고려됩니다. 그러나 원칙적으로 논리적으로 거기에서 3x3 행렬을 구동하면 대각선에서 고유값의 근을 가져와야 합니다. 특이값, 내림차순

파일:
jgdwni.rar  18 kb
 

원칙적으로 다른 예를 찾아 확인할 수 있습니다 ... 이러한 예가 만족스럽지 않으면 다른 예를 찾아 보겠습니다. 알고리즘이 제대로 작동하는지 확인하려면...

 

svd.cpp에 대한 설명에서:

출력 매개변수:
W - 내림차순으로 정렬된 단일 값을 포함합니다.
U - UNeeded=0이면 변경되지 않습니다. 왼쪽 특이 벡터
계산되지 않습니다.
UNeeded=1인 경우 왼쪽 특이 벡터를 포함합니다(첫 번째
행렬 U)의 min(M,N) 열. 요소 번호가 지정된 배열
[0..M-1, 0..Min(M,N)-1].
UNeeded=2인 경우 전체 행렬 U를 포함합니다. 배열에 번호가 지정됨
요소 [0..M-1, 0..M-1].
VT - VTNeeded=0인 경우 변경되지 않습니다. 오른쪽 특이 벡터
계산되지 않습니다.
VTNeeded=1인 경우 오른쪽 특이 벡터를 포함합니다.
(행렬 V^T의 첫 번째 min(M,N) 행). 번호 매기기가 있는 배열
요소 [0..min(M,N)-1, 0..N-1].
VTNeeded=2이면 전체 V^T 행렬을 포함합니다. 배열
요소의 번호 매기기 [0..N-1, 0..N-1].

 
모든 자료, 설명, 코드... 작업량... 그리고 궁극적으로 작업을 얼마나 평가할 것인지 살펴보고 이에 대해 논의합니다. 그런 다음 완성된 작업 dll 외에도 소스 코드를 얻고 싶습니다 ...
 
나는 당신을 정말로 바랍니다!
사유: