帮助解决从dll中导入函数的问题 - 页 9

 

М...是啊...真遗憾...与C++编程在Bilder...伙计,又有很多错误:'-(

:-)这个svd分解已经消耗了我很多时间,而且看起来没有尽头。

对不起,我问了一个不谦虚的问题,但你能不能以N次的费用来完成这项工作?

说实话,我已经厌倦了与之斗争......。我从9月2日开始在这个论坛上,在这之前,我有多么的挣扎...呜呜...

当然,我将来会学习C++,但这需要一些时间。

真的希望得到你的帮助。

 

这就是klot的奇异变换函数。

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

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

我不太明白你想做什么样的计算

与二维矩阵。

.

试着描述一下问题。

如果我觉得有道理,我就会帮助你。

.

我需要一步一步地看。

用这个填写一个3乘3的矩阵,把它送到那个地方。

我们应该得到一些东西。

要转移到更大的矩阵是一个技术问题。

 
对不起,我问了一个不谦虚的问题,但你能不能以N次的费用来完成这项工作?<br / translate="no">

好问题 :-)。

 

好吧,让我试着解释一下......。

我在看klot的MQL代码。起初,当我找到这个链接时,我非常高兴,但在理解了代码并思考了我想要的东西后,我意识到这并不完全是我想要的...

这是一个基于二分法的eigennumbers的搜索。在阅读了一些文献后,我了解到,当我们只找到所有可能的特征值的一部分时,这种算法是好的。

但如果一个正方形矩阵相当大,比如说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来实现这个想法可能会更好。我想知道你对这件事的看法。

由于正方形矩阵的维度在输入时是未知的,我建议将二维矩阵实现为一维矩阵,一旦知道了维度,就用ArrayResize函数来填充它。而这将是投入。然后将其转换为ap::real_2d_array,输入到rmatrixsvd。那里有一个方法。

void setbounds(int iLow1,int iHigh1,int iLow2,int iHigh2)
为阵列分配内存。这将删除旧的数组内容并释放为其分配的内存,然后分配一个新的、独立的内存区域,其大小为(iHigh1-iLow1+1)*(iHigh2-iLow2+1)元素。
新数组中第一维元素的编号从iLow1开始,以iHigh1结束,第二维也是如此。
新数组的内容是未定义的。

也就是说,在我看来,当数组的大小不被一维或二维事先知道时,这是一个非常方便的方法。

然后应该计算rmatrixsvd函数本身,它输出并给出二维矩阵中的奇异数和奇异向量,这些奇异数和奇异向量也被转换为一维矩阵,并已经输出到MQL中进行进一步处理。

这似乎就是全部。我想我没有忘记什么。

 

很明显,你真的想用一个复杂的变体来工作。

.

你说你有一个测试案例。

在其中,你需要填写一个3乘3的矩阵。

而你知道结果是什么。

.

现在你要告诉我什么是应该去的

到函数rmatrixsvd,以及它应该输出什么。

.

我想要具体的数字。

 

实例

尽管用第二个例子来检查可能更好。在第一种情况下,要计算eigennumbers。但原则上,从逻辑上讲,如果我们把一个3x3矩阵放在那里,我们应该在对角线上得到电子数的根,即奇异值,按降序排列

附加的文件:
jgdwni.rar  18 kb
 

原则上,你可以寻找其他的例子来检查...如果这些例子不能让你满意,我再去找其他的例子。这样我们就能确定该算法工作正常...

 

来自svd.cpp的描述。

输出参数。
W - 包含按降序排列的奇异值。
U - 如果UNeeded=0,不改变。左侧奇异向量
不作计算。
如果UNeeded=1,则包含左奇异向量(第一个
min(M,N)矩阵U的列)。一个有编号元素的数组
[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外,还能得到源代码......
 
我对你寄予厚望!