//ImportDll.mq4 (expertsindicators ディレクトリにあります) #include <ImportDll.mqh> int init()
{
Print("Return1="+Return1()。
return("0"); }.
ImportDll.ex4 を実行すると、次のように表示されます: dll call are not allowed; 'MyDll.dll' - 'Return1' HELP ....もう脳が壊れた((((((((((((((((((((((((((((((((((((((((((((((((((((((っ・ω・)っ
説明書に書かれている通りの仕上がりになりました
関数rmatrixsvdは "正直 "だ!
確認方法自体の問題はもはや関係なく、確認しました、動作しました。
実際には、チェックはソースマトリックスを比較することで行われます。
を、積 U x S x Vt とする。
.
対角行列もチェック。行のサイズは3...10、列のサイズは3...10の可能性があります。
元の行列と再構成された行列の差に、かなり厳しいチェックを入れています。
double delta = arr(row, col) - usRvt(row, col);
if(delta > 0.00000000001) { throw "Bad everything"; }.
この条件がうまくいったことはありません。
.
プライベートメッセージで メッセージを送った。
素晴らしい!!!
プライベート メッセージでメッセージを送りました。
では、説明しましょう。
正方行列が1000x1000と十分に大きい場合、二等分してすべての固有値を求めるのは非効率的であり、ここで現代の特異分解アルゴリズムの原理が前面に出てきます:行列を両角形に縮小し、QRアルゴリズムで対角化 します。これはサイトhttp://alglib.sources.ru/ から持ってきた文章です。さらに、「この単純な方式は非常に使い勝手が良いが、プログラムの速度を著しく向上させるような追加をすることで改良できる。以下に述べる改良型アルゴリズムのスキームは、ほぼ完全に LAPACK パッケージ(xGESVD サブルーチン)から借用したものである。アルゴリズムの詳細説明:http://alglib.sources.ru/matrixops/general/svd.php
例えば、私の仕事では、1000x1000以上の大きな行列を扱う高速なアルゴリズムが必要で、すべての特異値をベクトルとともに必要とします。そんなわけで、http://alglib.sources.ru/ ライブラリーに落ち着きました。特に、すでに出来上がったC++のコードが入っているのですから。300行のコードでもアルゴリズムはありますが、3000行のコードより遅いです。
1000x1000 の行列が非特異行列(無意味でない)になることは確かですか?
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
ポイントは、100万サンプル、すなわち1000x1000の実際の非ランダムデータでは、しばしばデータ間の線形依存性が明確に示され、行列は意味を失うということです。私自身は、例えば整数最適化などの実際の多段アルゴリズムで、このような大きな行列を特別に作って問題を解く、つまり次元を大きくして問題を解くという方法をいくつか知っています。このような大きな行列は人為的に作られたもので、そのセグメントは実際には問題の異なるバリエーションを表しており、つまりそれらはほとんど線形的に依存していないのです。
プログラムを作る前に、「1000x1000の行列が縮退していないことは確かか」という質問に答える必要があります。
本当に1000×1000のマトリックスで狭くない(意味のない)マトリックスができるのでしょうか?
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
ポイントは、100万サンプル、すなわち1000x1000の実際の非ランダムデータでは、しばしば、明確にデータ間の線形 関係が示され、行列は意味を持たなくなることです。私自身は、例えば整数最適化などの実際の多段アルゴリズムで、このような大きな行列を特別に作って問題を解く、つまり次元を大きくして問題を解くという方法をいくつか知っています。このような大きな行列は人為的に作られたもので、そのセグメントは実際には問題の異なるバリエーションを表しており、つまりそれらはほとんど線形的に依存していないのです。
プログラムを作る前に、「1000x1000の行列が縮退していないことは確かか?
見てみよう、見てみよう...。
プライベートメッセージでメッセージを送りました。
素晴らしい!!!
>>プライベートメッセージを送りました。
DLLをインポートできない。(((
MS Visual C++で、DLLを書きました:
//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
ライブラリ "MyDll"
EXPORTS Return1 @1
コンパイル後、MyDll.dllとMyDll.libを取得しました。
また、DLLを使ってC++でマイクロプログを書きました。プロジェクト設定でMyDll.libが指定された。DLLでも問題なく動作します。
そこで、MyDll.dllをexpertslibrariesディレクトリに置き、MT4からDLLをインポートしようとしました。ドキュメントに*.libのことが書いてなかったので、入れてないです。
//ImportDll.mqh (expertsincludeディレクトリ内)
#import "MyDll.dll"
int Return1();
//ImportDll.mq4 (expertsindicators ディレクトリにあります)
#include <ImportDll.mqh>
int init()
{
Print("Return1="+Return1()。
return("0");
}.
ImportDll.ex4 を実行すると、次のように表示されます: dll call are not allowed; 'MyDll.dll' - 'Return1'
HELP ....もう脳が壊れた((((((((((((((((((((((((((((((((((((((((((((((((((((((っ・ω・)っ