DLLから関数をインポートする際の問題解決を支援します。 - ページ 9

 

М...然りそりゃあもうBilderのC++プログラミングで...またエラー多発か :'-(

:-) このDVDの分解にはすでに多くの時間を消費しており、終わりが見えないようだ。

不謹慎な質問で申し訳ないのですが、N分の1の料金で仕事をお願いできないでしょうか?

正直、戦うのが嫌になってきた...。9月2日からこのフォーラムに参加しましたが、それ以前はどれだけ苦労したことか・・・。おぉ...

もちろん、将来的にはC++の勉強もしますが、時間がかかると思います。

本当に期待しています。

 

これがklotの特異変換関数の正体だった。

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

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

どのような計算をしたいのかがよくわからないのですが

を2次元の行列で表現しています。

.

問題を記述してみてください。

納得のいくものであれば、お手伝いしますよ。

.

ステップバイステップで見たい。

3×3のマトリックスにこれを記入し、あれに送る。

何か買わなきゃ

より大きなマトリクスに移行するのは、テクニックの問題です。

 
不謹慎な質問で申し訳ないのですが、N分の1の料金で仕事をしていただけませんか?<br /> translate="no">。

いい質問ですね :-)。

 

では、説明しましょう。

klotさんのMQLのコードを拝見していました。最初、リンクを見つけたときはとても嬉しかったのですが、コードを理解し、自分が欲しいものを考えてみると、ちょっと違うかな...と思いました。

二分割法による固有名詞の検索です。文献を読んで、このアルゴリズムは、可能な限りの固有値の一部しか見つからない場合に有効であることが理解できました。

しかし、正方行列が1000x1000と非常に大きい場合、二等分してすべての固有値を求めることは非効率であり、ここで現代のアルゴリズムの原理である特異点分解の出番となる、行列を両対角形に導き、その後QRアルゴリズムで対角化 するのである。これはサイトhttp://alglib.sources.ru/ から持ってきた文章です。さらに、「この単純な方式は非常に使い勝手が良いが、プログラムの速度を大幅に向上させるために改良することができる」という一文もある。以下に述べる改良型アルゴリズムのスキームは、ほぼ完全に LAPACK パッケージ(xGESVD サブルーチン)から借用したものである。アルゴリズムの完全な説明: http://alglib.sources.ru/matrixops/general/svd.php

つまり、私の仕事では、1000x1000あるいはそれ以上の大きな行列を扱う高速なアルゴリズムが必要で、すべての特異値をベクトルとともに正確に求める必要があります。そんなわけで、http://alglib.sources.ru/ ライブラリーに落ち着きました。特に、すでに出来上がったC++のコードが入っているのですから。そこに300行のアルゴリズムがあるのですが、3000行のコードより遅いんです。最初は、自分でDLLをコンパイルできるように、DLLの操作方法を学ぼうとしたのですが、うまくいきませんでした。そこで、C++からMQLに書き換えてみたのですが、アルゴリズムを把握して別の言語に翻訳するのもかなり難しいようです。その後、私はフォーラムを通じてdllに戻り、プロに助けを求めることにしました。このバージョンはより普遍的であると思われるからです、そう思いませんか?それに、私の理解では、MQL5がもうすぐリリースされます。MQL4との互換性がどうなるかは未知数です。ですから、DLLで実現したほうがいいかもしれませんね。この件に関するご意見をお聞かせください。

正方行列の次元数は入力時点では不明なので、2次元行列を1次元行列として実装し、次元数が判明したらArrayResize関数で埋めるのが良いと思います。そして、それがインプットされるのでしょう。その後、ap::real_2d_arrayに変換され、rmatrixsvdに入力される。そこにはメソッドがある。

void setbounds(int iLow1,int iHigh1,int iLow2,int iHigh2)
アレイにメモリを割り当てる。これは古い配列の内容を削除し、そのために割り当てられていたメモリを解放した後、(iHigh1-iLow1+1)*(iHigh2-iLow2+1)の要素サイズの新しい別のメモリ領域を確保します。
新しい配列の要素番号は,1次元目が iLow1 で始まり,2次元目が iHigh1 で終わります.
新しい配列の内容は未定義です。

すなわち、配列のサイズが1次元、2次元ともに事前に分からない場合には、非常に便利な方法だと私は思います。

そして、2次元行列の特異数、特異ベクトルを出力するrmatrixsvd関数自体を計算し、それを1次元行列に変換してMQLにエクスポートし、さらに処理する必要があります。

それだけのようです。何も忘れていないと思います。

 

明らかに、複雑なバリアントで仕事をしたいのが本音でしょう。

.

テストケースがあるとのことですが。

3×3のマトリックスを埋める必要があるもの。

そして、その結果はご存知の通りです。

.

今、あなたは私に何をすべきかを言うつもりです。

を関数rmatrixsvdに渡すと、何を出力するのかがわかります。

.

具体的な数字が知りたい。

 

事例紹介

2番目の例で確認した方が良いだろうが。1つ目は、英数字を数えることです。しかし、原理的には、3x3の行列を置くと、対角線上の固有値の根、すなわち特異値が降順に得られるはずである。

ファイル:
jgdwni.rar  18 kb
 

原則的には、他の例を探して確認することも可能ですが...。これらの例で満足できないなら、他の例を探します。アルゴリズムが正しく動作していることを確認するために...

 

svd.cppの説明より。

出力パラメータ。
W - 降順に並べられた特異値を含む。
U - UNeeded=0の場合、変更しない。左特異ベクトル
は計算されない。
UNeeded=1 の場合,左特異ベクトル(最初の
行列Uのmin(M,N)列)。番号付けされた要素を持つ配列
[0...M-1, 0...Min(M,N)-1] とする。
UNeeded=2 の場合,完全な行列 U を含む。要素に番号を付けた配列 [0.
要素数 [0..M-1, 0..M-1] の番号付き配列.
VT - VTNeeded=0の場合、変更されない。右特異ベクトル
は計算されない。
VTNeeded=1 の場合,右特異点ベクトルが含まれる
(行列V^Tの最初のmin(M,N)行)です。番号付けされた配列
の要素 [0...min(M,N)-1, 0...N-1]。
VTNeeded=2 の場合, V^T の完全な行列を含む。 を持つアレイ
を、要素に [0..N-1, 0..N-1] と番号付けすることで実現します。

 
資料、説明、コード...すべて見るんですね。業務範囲...とか、最終的にいくらの価格設定にするかとか、相談しながら決めていきましょう。その時は、完成した動作するDLLに加えて、ソースコードも頂きたいのですが...。
 
期待していますよ!