Bir dll'den bir işlevi içe aktarma sorununu anlamaya yardımcı olun - sayfa 9

 

M... evet... yeşil melankoli... Builder'da C++ programlama ile... Kahretsin, yine bir sürü hata :'-(

:-) bu svd ayrıştırması zaten çok zamanımı aldı ve görünüşe göre kenarın sonu görünmüyor.

Saçma sapan soru için özür dilerim ama N. ödül için bu işi kabul edebilir misin?

Dürüst olmak gerekirse, onunla kavga etmekten bıktım zaten... 2 Eylül'den beri forumdayım ve ondan önce ne kadar savaştım... Uuuu...

Gelecekte elbette C++ çalışacağım ama bu zaman alıyor.

yardımın için çok umut ediyorum.

 

İşte klot'un tekil dönüşüm fonksiyonu:

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

>> void fastsingular( double X[],int n,int l,int s,double &Y[])

Ne tür hesaplamalar yapmak istediğini tam olarak anlamadım

2 boyutlu matrisler ile.

.

Sorunu tanımlamaya çalışın.

Her şey benim için açıksa, sana yardım edeceğim.

.

Adım adım görmem gerekiyor:

3'e 3 matrisi bir şeyle doldurun, oraya gönderin,

bir şey almak gerekir.

Daha büyük matrislere geçmek bir teknik meselesidir.

 
Saçma sapan soru için özür dilerim ama N. ödül için bu işi kabul edebilir misin?

İyi soru :-).

 

Tamam, açıklamaya çalışacağım...

Klot'un MQL koduna baktım. İlk başta bağlantıyı bulduğumda çok mutlu olmuştum ama kodu düzenleyip ne istediğimi düşündükten sonra bunun pek doğru olmadığını anladım...

Orada özdeğerleri bulmak ikiye bölmeye dayanır. Belli bir miktar literatürü okuduktan sonra, mümkün olan tüm özdeğerlerin sadece bir kısmını bulursak, bu algoritmanın iyi olduğunu anladım.

Kare matris yeterince büyükse, diyelim 1000x1000, o zaman tüm özdeğerleri ikiye bölmeler yoluyla bulmak verimsizdir ve burada modern tekil değer ayrıştırma algoritmalarının çalışma prensibi öne çıkıyor: matrisi iki köşegene indirgemek QR algoritması tarafından müteakip köşegenleştirme ile oluşturur. Metni http://alglib.sources.ru/ sitesinden alıntılıyorum. Bunu şu ifade takip eder: Bu basit şema tamamen işlevseldir, ancak programın hızını önemli ölçüde artırarak tamamlanabilir. Aşağıda açıklanan geliştirilmiş algoritmanın şeması, neredeyse tamamen LAPACK paketinden (xGESVD alt programı) ödünç alınmıştır. Algoritmanın tam açıklaması: http://alglib.sources.ru/matrixops/general/svd.php

Onlar. görevlerim için 1000x1000, belki daha fazla büyük matrislerle çalışan hızlı bir algoritmaya ihtiyacım var .. ve vektörlerle birlikte tam olarak TÜM tekil değerlere ihtiyacım var, yani. tam ayrışma. Bu nedenle http://alglib.sources.ru/ kütüphanesine yerleştim. Üstelik C++ da zaten hazır kod var. 300 satır kod için bir algoritma var, ancak 3000 satırlık koddan daha yavaş. İlk başta dll ile çalışmayı öğrenmeye çalıştım, daha sonra kendi dll'imi bağlayabildim, işe yaramadı. Sonra C++'dan MQL'ye yeniden yazmaya çalıştım ama aynı zamanda algoritmayı anlamak ve hatta başka bir dile aktarmak benim için oldukça zor oldu. Sonra tekrar forum üzerinden dll'ye dönmeye ve uzmanlardan yardım istemeye karar verdim, çünkü bu seçenek hala bana göre daha evrensel, ne düşünüyorsunuz? Üstelik anladığım kadarıyla MQL5 yakında çıkacak. MQL4 ile uyumluluğun ne olacağı hala bilinmiyor. Bu nedenle, tüm bunları bir dll aracılığıyla uygulamak muhtemelen daha iyidir. Bu konudaki görüşlerinizi duymak isterim.

Çünkü girişte, bir kare matrisin boyutu önceden bilinmeyecek, o zaman anladığım kadarıyla, tek boyutlu olarak 2 boyutlu bir matrise sahip olmak daha iyidir ve boyut bilindiğinde, o zaman kullanın ArrayResize işlevi, doldurun. Ve bu giriş olacak. Daha sonra rmatrixsvd'ye girmek için ap::real_2d_array'e dönüştürülür. Orada bir yöntem var:

geçersiz ayar sınırları( int iLow1, int iHigh1, int iLow2, int iHigh2)
Bir dizi için bellek ayırın. Aynı zamanda dizinin eski içerikleri silinir ve kendisine ayrılan bellek serbest bırakılır, ardından (iHigh1-iLow1+1)*(iHigh2-iLow2+1) öğeleri boyutunda ayrı bir bellek alanı yeniden oluşturulur. tahsis edildi.
Yeni dizideki öğelerin birinci boyuta göre numaralandırılması, ikinci boyut için benzer şekilde iLow1'den başlar ve iHigh1 ile biter.
Yeni dizinin içeriği tanımsız.

Yani ne 1. boyutta ne de 2. boyutta dizinin boyutu önceden bilinmediğinde yöntemi çok uygun buluyorum.

Daha sonra, çıktıda hem tekil sayıları hem de tekil vektörleri 2 boyutlu matrislerde veren, ayrıca tek boyutluya dönüştürülen ve daha sonraki işlemler için MQL'ye aktarılan rmatrixsvd işlevinin kendisi hesaplanmalıdır.

Görünüşe göre hepsi bu. Bir şey unuttuğumu sanmıyorum.

 

Her şey açık, gerçekten karmaşık bir seçenekle çalışmak istiyorsunuz.

.

Bir test durumunuz olduğunu söylediniz.

3'e 3'lük bir matrisi doldurmanız gereken.

Ve sonuç biliniyor.

.

Şimdi bana ne gitmesi gerektiğini söyle

rmatrixsvd işlevinin girdisine ve ne üretmesi gerektiğine.

.

Belirli numaralara ihtiyacım var.

 

Örnekler

Yine de, doğrulama için ikinci örneği kullanmak muhtemelen daha iyidir. Ve ilkinde, kendi sayıları dikkate alınır. Ancak prensipte, mantıksal olarak, oraya 3x3'lük bir matris sürerseniz, köşegen üzerindeki özdeğerlerin köklerini almalısınız, yani. tekil değerler, azalan

Dosyalar:
jgdwni.rar  18 kb
 

Prensip olarak, kontrol etmek için başka örnekler arayabilirsiniz ... Bu örnekler sizi tatmin etmiyorsa, o zaman başka örneklere bakacağım. Algoritmanın düzgün çalıştığından emin olmamız için...

 

svd.cpp açıklamasından:

Çıkış parametreleri:
W - azalan düzende sıralanmış tekil değerler içerir.
U - UNEeded=0 ise değişmez. Sol tekil vektörler
hesaplanmaz.
UNeeded=1 ise, sol tekil vektörler içerir (ilk
U) matrisinin min(M,N) sütunları. Eleman numaralandırmalı dizi
[0..M-1, 0..Dk(M,N)-1].
UNeeded=2 ise, U matrisinin tamamını içerir. Numaralandırılmış dizi
elemanlar [0..M-1, 0..M-1].
VT - VTNeeded=0 ise değişmez. Sağ tekil vektörler
hesaplanmaz.
VTNeeded=1 ise, sağ tekil vektörleri içerir
(V^T matrisinin ilk min(M,N) satırları). Numaralandırmalı dizi
elemanlar [0..min(M,N)-1, 0..N-1].
VTNeeded=2 ise, tam V^T matrisini içerir. ile dizi
elemanların numaralandırılması [0..N-1, 0..N-1].

 
Tüm materyallere, açıklamalara, kodlara... işin miktarına... ve nihayetinde işinizi ne kadar değerlendireceğinize bakıyorsunuz ve bunu sizinle tartışacağız. O zaman, bitmiş çalışan dll'ye ek olarak kaynak kodlarını da almak istiyorum ...
 
Senin için gerçekten umuyorum!