首先,我间接搞到了 @Truffer 慷慨分享的部分源码:
很明显这只是项目很少的一部分,某高赞回答上 @jeffswt 的命令行图并非来自于这些代码,所以我对关于Octave部分的真实性不加评论。
出于学习目的,我打开了CMatrix.cs,看上去是这样的:
Matrix和CMatrix大同小异(实矩阵运算和复矩阵完全分开),源码放到最后供大家观赏,这里只写了我浅浅拜读一下看到的一些亮点...
我没有学过软件工程,但数值方法还是略知一点的(本来这几个文件也没啥工程可言),所以关注点放到了数值方法上。
首先,矩阵数值运算就涉及到解数值方程组(MATLAB里面的 A),我一直以来就好奇MATLAB的具体是如何实现的,看到上面只有一个System,我更是不由自主地兴奋了起来...(似乎忘记了C#这个奇怪的点)... 然而,我前前后后翻了个遍,也没有看到任何能求线性方程组(或其最优最小二乘)解的方法,甚至没有一个能求逆/广义逆的方法...看到开头“初级版本”的说明,我不禁释然...
我并不甘心,希望找到一个(300年来应用数学发明的)数值方法,翻到最后,眼前一亮:FFT!(先忽略为什么对矩阵对象的FFT没有维数输入方式),然后被惊呆了:
using System; using System.Text; using System.Data; namespace Legal.Math { public class CMatrix { //省略属性和其他方法 public int Length { get { if (_length <= 0) _length = Rows * Columns; return _length; } private set { _length = 0; } } #endregion public static CMatrix FFT(CMatrix Ma) { CMatrix p = new CMatrix(Ma.Rows, Ma.Columns); for (int k = 0; k < Ma.Length; k++) { double x = 0.0; double y = 0.0; double s = 0.0; double t = 2 * System.Math.PI * k / Ma.Length; for (int i = 0; i < Ma.Length; i++) { x += Ma[i].Real * System.Math.Cos(s) + Ma[i].Imaginary * System.Math.Sin(s); y += Ma[i].Imaginary * System.Math.Cos(s) - System.Math.Sin(s) * Ma[i].Real; s += t; } p[k] = new Complex(x, y); } return p; } } }
多么简洁的代码!根本不用什么补零,不用什么玄学二进制排序,不用什么递归变循环...别问,要问就是算!俩循环套起来算!...唯一的缺点就是这应该叫DFT,而不是使用FFT算法的DFT...
分割--------------------------------
题主问如何评价,问题是我感觉这三个源代码和演示效果没啥关系,就矩阵运算而言,这几个代码文件离MATLAB大概还差那么几百万行代码吧(参考openblas)。所以这些源代码大概是人家作者放出来骗人的吧...至于真的TRUFFER,没有公开的应用程序,所以不评价。
源码(作者在里面说“比开源还开源”,所以就都放上来了)
链接:https://pan.baidu.com/s/1q0-SDVcMXwuMzNFoM-ZaCQ
提取码:yj94
(大家都在喷百度网盘,但这个文件不怕限速...)
大部分欧洲国家和美国,不但给你孩子冠姓,还给你冠姓,还有首歌形容结婚:以我之姓 冠你之名。
大部分欧洲国家和美国,不但给你孩子冠姓,还给你冠姓,还有首歌形容结婚:以我之姓 冠你之名。