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

 

Her şey tam olarak belgelerde açıklandığı gibi çıktı!

rmatrixsvd işlevi "dürüst"!

Kendisinin nasıl kontrol edileceği sorusu artık alakalı değil - Kontrol ettim, çalışıyor.

Aslında, kontrol orijinal matrisi karşılaştırmaktan ibarettir.

U x S x Vt ürünü ile.

.

Ayrıca çapraz matrisleri de kontrol ettim, tüm olası satır boyutları 3..10 - sütun 3..10.

Orijinal matris ile geri yüklenen matris arasındaki farkı oldukça sıkı bir şekilde kontrol ettim:

çift delta = dizi(satır, sütun) - usRvt(satır, sütun);
if(delta > 0.00000000001) { "Her şey kötü" fırlat; }

Bu durum benim için hiçbir zaman işe yaramadı.

.

Özel mesaj gönderdi .

 

İyi!!!

Özel mesaj gönderdi .

 
boysn >> :

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


Kare matris yeterince büyükse, diyelim 1000x1000, o zaman tüm özdeğerleri ikiye bölme 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ş.

1000x1000 matrisin dejenere olmayacağından (anlamsız olmayacağından) emin misiniz?

https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%BD%D0 %B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

Gerçek şu ki, bir milyon örnekle, yani 1000x1000 ile gerçek rastgele olmayan verilerde, veriler arasında doğrusal bir bağımlılık sıklıkla ve net bir şekilde izlenir ve matris anlamını kaybeder. Bu, 1000x1000 matrislerde sorun olmadığı anlamına gelmez, kişisel olarak birkaç gerçek çok aşamalı algoritmayı biliyorum, örneğin, tamsayı optimizasyonu, böyle büyük bir matrisin sorunu çözmek için özel olarak derlendiği, aksi takdirde sorun çözülemez yani boyut büyütülerek çözülür. Böyle büyük bir matris yapay olarak yapılır, segmentleri aslında görevlerin farklı versiyonlarıdır, yani neredeyse doğrusal olarak bağımlı değildir.

Bir programı şekillendirmeden önce şu soruyu cevaplamanız gerekiyor: 1000x1000 matrisinizin dejenere olmadığından emin misiniz?

 
AlexEro писал(а) >>

1000x1000 matrisin dejenere olmayacağından (anlamsız olmayacağından) emin misiniz?

https://ru.wikipedia.org/wiki/%D0%92%D1%8B%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%BD%D0 %B0%D1%8F_%D0%BC%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0

Gerçek şu ki, bir milyon örnekle, yani 1000x1000 ile gerçek rastgele olmayan verilerde, veriler arasında doğrusal bir bağımlılık sıklıkla ve net bir şekilde izlenir ve matris anlamını kaybeder. Bu, 1000x1000 matrislerde sorun olmadığı anlamına gelmez, kişisel olarak birkaç gerçek çok aşamalı algoritmayı biliyorum, örneğin, tamsayı optimizasyonu, böyle büyük bir matrisin sorunu çözmek için özel olarak derlendiği, aksi takdirde sorun çözülemez yani boyut büyütülerek çözülür. Böyle büyük bir matris yapay olarak yapılır, segmentleri aslında görevlerin farklı versiyonlarıdır, yani neredeyse doğrusal olarak bağımlı değildir.

Bir programı şekillendirmeden önce şu soruyu cevaplamanız gerekiyor: 1000x1000 matrisinizin dejenere olmadığından emin misiniz?

Bakalım, göreceğiz...

 
jartmailru писал(а) >>

Özel mesaj gönderdi.

İyi!!!

Özel mesaj gönderdi.

 

DLL içe aktarılamıyor. ((((

MS Visual C++'da bir DLL yazdım:

//MyDll.h

#define MY_EXPORT extern "C" __declspec ( dllexport )
MY_EXPORT int CALLBACK Return1();

//MyDll.cpp

MY_EXPORT int CALLBACK Return1() { return 1; }

//MyDll.def

KÜTÜPHANE "MyDll"

İHRACAT İade1@1

Derlemeden sonra MyDll.dll ve MyDll.lib'i aldım

Ayrıca DLL kullanarak C++ ile bir mikro program yazdım. Projenin ayarlarında belirtilen MyDll.lib. DLL ile iyi çalışıyor.

Ardından MyDll.dll dosyasını uzmanlar\libraries dizinine koyarak DLL dosyasını MT4'ten içe aktarmayı denedim. Belgelerde * .lib ile ilgili bir şey bulamadım, o yüzden koymadım.
//ImportDll.mqh (uzmanlar\include dizininde)
#"MyDll.dll"yi içe aktar

int Dönüş1();

//ImportDll.mq4 (uzmanlar\göstergeler dizininde)
#include <ImportDll.mqh>
int init()

{

Print("Dönüş1="+Dönüş1());

dönüş(0);
}

ImportDll.ex4'ü çalıştırdığınızda şunu söyler: dll çağrılarına izin verilmez; 'MyDll.dll' - 'Dönüş1'
YARDIM .... Zaten yosun kırdım ((((((((((((((((((((( ICQ m: 573794562, e-posta : AKalashnikov84@mail.ru.