랜덤 흐름 이론과 FOREX - 페이지 40

 
Prival >> :

전치 절차를 수행하십시오. MQL에서는 작동하지 않습니다. 다음은 matkad의 예입니다. 한 가지 조건은 m과 n의 차원을 미리 알 수 없고 함수는 가급적이면 nonversal이어야 한다는 것입니다. 전치할 배열은 중요하지 않습니다. 물론 반복적으로 호출되어야 하고 동시에 올바르게 작동해야 합니다.

글쎄, 그것을 시도 :



 void transposeMatrix ( int rows , int cols , double a [ ] , double & t [ ] )
{
     for ( int i = 0 ; i < rows ; i + + )
     {
         for ( int j = 0 ; j < cols ; j + + )
         {
            t [ j * rows + i ] = a [ i * cols + j ] ;
         }
     }
}

void example ( )
{
     int m = 5 ;
     int n = 3 ;

     int aRows = m + 1 ;
     int aCols = 1 ;
     double A [ ] ;

     ArrayResize ( A , aRows * aCols ) ;

     for ( int i = 0 ; i < = m ; i + + ) A [ i ] = i ;

     int bRows = m + 1 ;
     int bCols = n + 1 ;
     double B [ ] ;

     ArrayResize ( B , bRows * bCols ) ;

     for ( i = 0 ; i < = m ; i + + )
     {
         for ( int j = 0 ; j < = n ; j + + ) B [ i * bCols + j ] = i + j ;
     }

     // Получаем результат транспонирования A в AT

     double AT [ ] ;
     ArrayResize ( AT , aRows * aCols ) ;

    transposeMatrix ( aRows , aCols , A , AT ) ;

     // Получаем результат транспонирования B в BT

     double BT [ ] ;
     ArrayResize ( BT , bRows * bCols ) ;

    transposeMatrix ( bRows , bCols , B , BT ) ;
}
 

아니오, 불가능합니다. 전치되어야 하는 행렬 A와 B이며, AT와 BT 행렬을 2개 더 생성했습니다. 즉, 전치하지 않았지만 원래 행렬과 관련하여 전치된 행렬을 만들었습니다.

 

나는 어떤 차이도 보이지 않는다. 더 추가:


ArrayCopy( A, AT );
ArrayCopy( B, BT );

필요한 경우 원래 행렬에서 전치 결과를 가져옵니다.


나는 전치된 행렬이 필요한 곳에 AT와 BT를 사용할 것이지만, 왜냐하면 그들은 일반적으로 쌍으로 이동합니다.

 
bstone писал(а) >>

나는 어떤 차이도 보이지 않는다. 더 추가:

필요한 경우 원래 행렬에서 전치 결과를 가져옵니다.


나는 전치된 행렬이 필요한 곳에 AT와 BT를 사용할 것이지만, 왜냐하면 그들은 일반적으로 쌍으로 이동합니다.

AT와 BT의 사본을 만들어 필요한 곳에 사용할 수 있도록 해주셔서 감사합니다. 이것이 가능한지 연필로 확인하겠습니다. 그러나 칼만 필터가 반복적이고 동일한 행렬이 여러 번 전치되기 때문에 각 틱에 대해 곱하지 마십시오.

그러나 당신은 조옮김에 실패했습니다.

뭔가 잘못했습니다. 행렬 B와 BT는 2차원입니다. 그들의 순위는 2이고 당신은 1입니다.

Insert Print("-------",ArrayDimension(BT)); 답변 1

저것들. 1차원 배열이 있고 행을 열로 바꾸지 않았습니다.

 
Prival >> :

저것들. 1차원 배열이 있고 행을 열로 바꾸지 않았습니다.

결론을 서두르지 마십시오. 배열은 외부에서 1차원이지만 내부에서 2차원입니다. :)

 
bstone писал(а) >>

결론을 서두르지 마십시오. 배열은 외부에서 1차원이지만 내부에서 2차원입니다. :)

그런 다음 전체 행렬 대수학이 이해합니다. 여기 matkad에서 다시 그림이 있습니다. 나는 나의 모범을 계속한다.

곱셈뿐만 아니라 모든 종류의 연산 + 행렬 대수에만 고유한 특정 연산이 있습니다.

전치 중에 차원이 위반되면 모든 것이 매우 나쁘고 나쁩니다.

이것은 쉬운 작업이 아닙니다. 언뜻 보기에는 행을 열로 바꾸는 것이 잘못된 것처럼 보이지만 급습에서는 그렇게 작동하지 않습니다.

이 작업은 확실히 풀 수 있는 것으로 알려져 있지만 MQL에서만 오른손이 왼쪽 귀 뒤에 있고 손이 닿지 않는 것을 신이 금지합니다.

 
Prival >> :

그런 다음 전체 행렬 대수학이 이해합니다. 여기 matkad에서 다시 그림이 있습니다. 나는 나의 모범을 계속한다.


남. Prival, 저를 믿으세요. 저는 행렬 대수학을 아주 잘합니다. 저는 MQL4의 맥락에서 귀하의 문제에 대한 솔루션을 제공했습니다. 물리적으로 다른 해결책은 없습니다. MQL4에서는 첫 번째 차원만 동적으로 제어할 수 있습니다.


완전한 행렬 연산 라이브러리를 얻으려면 행렬을 나타내는 다른 추상화로 작업하도록 현재 버전을 다시 만들어야 합니다. 특히, 2차원 배열에서 선형 배열로 이동해야 합니다.


matkad가 행렬을 저장하는 방법에 대해 생각해 보십시오. 선형 배열인지 여부 아니면 그가 그것들을 2차원 하드 드라이브에 저장한다고 생각하십니까? 태곳적부터 다차원 배열은 행 단위 또는 행 단위의 두 가지 데이터 배포 옵션을 사용하여 메모리에 선형으로 저장되었습니다.


3x2 행렬이 있는 경우 행별로 쌓을 때 메모리(선형 배열)에 다음과 같이 표시됩니다. { a(1,1) a(1,2) a(2,1) a(2,2 ) 에이(3.1) 에이(3.2) }


따라서 모든 매트릭스 작업은 이러한 데이터 구성을 사용해야 합니다. 기존 코드에서 2차원 인덱싱에서 선형 인덱싱으로 전환하는 것은 어렵지 않습니다. 그러나 행렬의 동적 차원을 완전히 제어할 수 있습니다.

 

그건 그렇고, 직사각형 행렬을 원래 원했던 형태로(즉, 원래 배열에서 즉시) 전치하는 작업은 언뜻 보기에 그리 간단하지 않습니다. 사실 이것은 복잡한 작업이고 이를 해결하기 위한 복잡한 알고리즘이 많이 있습니다. 프로그래밍의 신들은 1950년대부터 효과적인 솔루션(최소 순열 수, 캐시 지역성, 최소 추가 메모리 등)으로 어려움을 겪고 있습니다.


그러니 풀지 못했다고 너무 자책하지 마세요.

 
Prival >> :

그러나 당신은 조옮김에 실패했습니다.

뭔가 잘못했습니다. 행렬 B와 BT는 2차원입니다. 그들의 순위는 2이고 당신은 1입니다.

Insert Print("-------",ArrayDimension(BT)); 답변 1

저것들. 1차원 배열이 있고 행을 열로 바꾸지 않았습니다.

"행렬 순위"와 "배열 순위"의 개념은 동일합니까? 내가 기억하는 한, 행렬의 순위는 소수의 차수 중 가장 큰 차수입니다 ... 그러나 "배열의 순위"는 무엇입니까 ... 솔직히 말하면, 나는 . ..

 
bstone писал(а) >>

남. Prival, 저를 믿으세요. 저는 행렬 대수학을 아주 잘합니다. 저는 MQL4의 맥락에서 귀하의 문제에 대한 솔루션을 제공했습니다. 물리적으로 다른 해결책은 없습니다. MQL4에서는 첫 번째 차원만 동적으로 제어할 수 있습니다.

이것은 개가 묻힌 곳입니다. 배열을 프로시저로 또는 프로시저에서 전달할 수 있는지 여부를 결정하는 또 하나의 방법이 있지만 MQL4는 이 작업도 허용하지 않습니다. 항상 우회할 수 있고, 위에 주어진 모델을 기반으로 지표를 만들고, 모든 전치, 행렬 역전을 제거하고, 행렬 지수를 만들었습니다(SQRT(-1), 그러나 우회할 수 없었습니다) 등. MQL4(매트릭스 2*2)에서 Kalman을 구현할 수 있지만 3개월 이상 소요된 방법. 이제 통화를 1개 더 추가하기로 결정하면 모든 것이 새롭습니다. 그리고 이것은 시간 낭비이자 엄청난 낭비입니다. 나는 작업의 속도를 기반으로 오랫동안 프로그래밍 언어를 선택해왔다(그리고 나는 메모리, 효율성, 스택에 대해 알고 있다. 주요 시간은 우리가 가진 유일한 가치입니다.

bstone 도와주셔서 감사합니다. MQL5를 기다리겠습니다.