Rastgele Akış Teorisi ve FOREX - sayfa 40

 
Prival >> :

Lütfen aktarma prosedürünü yapın, MQL'de benim için çalışmıyor. İşte matkad'da bir örnek. Bir koşul, m ve n boyutlarının önceden bilinmemesi ve fonksiyonun tercihen ters olmamasıdır, yani. hangi dizinin devrik olduğu önemli değil, elbette tekrar tekrar çağrılmalı ve aynı anda doğru çalışmalıdır.

Peki, dene:



 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 ) ;
}
 

hayır, imkansız, A ve B matrisinin yer değiştirmesi gerekiyor ve AT ve BT 2 matrisi daha oluşturdunuz, yani devrik değil, orijinaline göre devrik matrisler yaptınız

 

Ben bir fark görmüyorum. Daha ekle:


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

gerekirse ve orijinal matrislerdeki yer değiştirmenin sonucunu alın.


Transpoze matrislere ihtiyacım olan yerde sadece AT ve BT kullansam da, çünkü genellikle çiftler halinde giderler.

 
bstone писал(а) >>

Ben bir fark görmüyorum. Daha ekle:

gerekirse ve orijinal matrislerdeki yer değiştirmenin sonucunu alın.


Transpoze matrislere ihtiyacım olan yerde sadece AT ve BT kullansam da, çünkü genellikle çiftler halinde giderler.

AT ve BT'nin kopyalarını alma ve bunları gerektiğinde kullanma fikri için teşekkürler. Bunu yapmanın mümkün olup olmadığını bir kalemle kontrol edeceğim, ama korkarım değil, çünkü Kalman filtresi yinelemeli ve aynı matris birkaç kez yer değiştiriyor, her tik için onları çarpmayın.

Ama transpoze edemedin.

Yanlış bir şey yaptınız - B ve BT matrisi iki boyutludur, yani. onların sıralaması = 2 ve sende 1 var.

Print("-------",ArrayDimension(BT)); cevap 1

onlar. tek boyutlu bir diziniz var ve hiçbir satırı sütunlarla değiştirmediniz.

 
Prival >> :

onlar. tek boyutlu bir diziniz var ve hiçbir satırı sütunlarla değiştirmediniz.

Sonuçlara acele etmeyin - diziler dışta tek boyutlu, içte iki boyutludur :)

 
bstone писал(а) >>

Sonuçlara acele etmeyin - diziler dışta tek boyutlu, içte iki boyutludur :)

Anlayın o zaman tüm matris cebiri uçar, işte yine matkaddan resim. Örneğime devam ediyorum.

ve yalnızca çarpma değil, her tür işlem + yalnızca matris cebirinde bulunan belirli işlemleri vardır.

Aktarım sırasında boyut ihlal edilirse, her şey kötü, çok kötü.

Bu kolay bir iş değil, ilk bakışta satırları sütunlarla değiştirmenin nesi yanlış, ancak bir baskınla böyle çalışmıyor.

Bu görevin çözülebilir olduğu kesin olarak bilinmesine rağmen, sadece MQL'de sağ el sol kulağın arkasındadır ve Allah korusun ona ulaşamam.

 
Prival >> :

Anlayın o zaman tüm matris cebiri uçar, işte yine matkaddan resim. Örneğime devam ediyorum.


SW. Prival, inan bana, matris cebirinde çok iyiyim. Sorununuza MQL4 bağlamında bir çözüm önerdim. Fiziksel olarak başka bir çözüm yok, çünkü MQL4'te yalnızca birinci boyut dinamik olarak kontrol edilebilir.


Tam teşekküllü bir matris işlemleri kitaplığı elde etmek için, mevcut sürümünüzü matrisleri temsil etmek için farklı bir soyutlama ile çalışacak şekilde yeniden oluşturmanız gerekir. Spesifik olarak, iki boyutlu dizilerden doğrusal dizilere geçmeniz gerekir.


Matkad'ın matrisleri nasıl sakladığını bir düşünün? Doğrusal dizilerde olsun mu? Yoksa onları iki boyutlu sabit disklerde mi sakladığını düşünüyorsunuz? Çok eski zamanlardan beri, çok boyutlu diziler, veri dağıtımı için iki seçenek kullanılarak bellekte doğrusal olarak depolandı: satır satır veya sütun satır.


3x2'lik bir matrisiniz varsa, satır satır istiflendiğinde bellekte (doğrusal dizi) şöyle görünür: { a(1,1) a(1,2) a(2,1) a(2,2) ) a( 3.1) a(3.2) }


Buna göre, tüm matris işlemleri bu tür veri organizasyonunu kullanmalıdır. Mevcut kodda iki boyutlu indekslemeden lineer indekslemeye geçmek zor olmamalı. Ancak matrislerin dinamik boyutları üzerinde tam kontrol sahibi olursunuz.

 

Bu arada, dikdörtgen matrisleri orijinal olarak istediğiniz formda (yani, hemen orijinal dizide) aktarma işlemi, ilk bakışta göründüğü kadar önemsiz değildir. Aslında bu karmaşık bir iştir ve bunu çözmek için birçok karmaşık algoritma vardır. Programlama tanrıları, 1950'lerden bu yana etkili çözümü (minimum permütasyon sayısı, önbellek konumu, minimum ek bellek vb.) ile mücadele ediyor.


Bu yüzden çözememek için kendinizi çok fazla tekmelemeyin.

 
Prival >> :

Ama transpoze edemedin.

Yanlış bir şey yaptınız - B ve BT matrisi iki boyutludur, yani. onların sıralaması = 2 ve sende 1 var.

Print("-------",ArrayDimension(BT)); cevap 1

onlar. tek boyutlu bir diziniz var ve hiçbir satırı sütunlarla değiştirmediniz.

"Matris sıralaması" ve "dizi sıralaması" kavramları aynı mıdır? Hatırladığım kadarıyla, bir matrisin rankı, minörlerinin mertebelerinin en büyüğüdür... Ama "bir dizinin rankı" nedir... dürüst olmak gerekirse, bilmiyorum. ..

 
bstone писал(а) >>

SW. Prival, inan bana, matris cebirinde çok iyiyim. Sorununuza MQL4 bağlamında bir çözüm önerdim. Fiziksel olarak başka bir çözüm yok, çünkü MQL4'te yalnızca birinci boyut dinamik olarak kontrol edilebilir.

Burası köpeğin gömülü olduğu yerdir, prosedüre ve prosedürden dizileri geçirmenin mümkün olup olmayacağına karar vermenin bir yolu daha vardır, ancak MQL4 bunun yapılmasına da izin vermez. Baypas etmek her zaman mümkündür, yukarıda verilen modele göre bir gösterge yaptım, tüm transpozisyonlardan kurtuldum, matris inversiyonları yaptım, bir matris üssü yaptım (SQRT(-1), ama atlayamadım), vb. Kalman'ı MQL4'te (matrix 2*2) nasıl uygulayabilirim ama bunun üzerinde 3 aydan fazla zaman harcadım. Ve şimdi 1 para birimi daha eklemeye karar verirsem, her şey yeni. Ve bu bir zaman kaybı ve çok büyük bir kayıp. Uzun zamandır görevin hızına bağlı olarak bir programlama dili seçiyorum (ve hafıza, verimlilik, yığın hakkında bilgim var, uzun zaman önce assembler'da programlama yapardım). Ana zaman, sahip olduğumuz tek değerdir.

bstone yardım etmeye çalıştığınız için teşekkürler, MQL5'i bekliyor olacağım.