12月12日: @Truffer 距离半年之期还有十天,你们当初“负责任地告诉大家”的内容,实现多少了?半年内实现Matlab科学计算与图形显示的70%;1年内100%全部实现;3年内完全实现Simulink;100%自主版权源代码;无需#openGL#等组件支持的三维、四维图形显示。
9月16日:刚刚发现Truffer在gitee上有一个仓库。https://gitee.com/truffer/Truffergitee.com
他们没有公开源代码,以dll的形式发布了程序。简单阅读了一下,有以下几点收获:从metadata里面可以看到,目前这个库的规模比最初发布的要大了很多,功能上确实如Truffer所说完善了不少。
整个库的设计仍然存在很多问题:仍然只有二维矩阵,仍然不支持view、slice类似的操作;
实数矩阵和复数矩阵使用完全独立的两个类实现,这是完全不行的。举个例子,eigen函数返回的是实数矩阵,但是特征值分解很容易得到复数结果,这个设计完全不合理,建议把Generic之类的东西用起来;
尝试运行ex.inverse(ex.eye(3, 3)),返回结果为“奇异矩阵”。因为gitee没法匿名issue,我又不想实名,所以在这里提出一下,无意指责,希望truffer加强debug。
总结一下:
首先,我诚恳地向 @Truffer 道歉:之前指责你们是骗子,这个说法是不正确的,是我的情绪化反应。你们只是能力不足,却又没有自知之明,敢于拿着半成品都不算、错漏百出的库招摇过市,仅此而已。希望你们能继续努力,争取一年之内搞出没有明显bug的产品。
然后,Truffer追赶Matlab什么的,大家最好是都当忘了这件事,因为希望渺茫。Truffer的上限是下面这个库,Math.NET Numericsnumerics.mathdotnet.com
同样是C#实现,使用MIT/X11协议开源,提供IntelMKL加速。和Truffer除了图形界面以外,完全是同类产品而且有碾压的优势。
最后强调一下,国产本身不是目的,国产的目的应该是可控。Numpy使用BSD-3协议,Octave使用GPL协议,上面的http://Math.NET使用MIT/X11协议。开源+开源协议已经保证了这些库/软件是可控的,所以除了搞噱头骗投资之外,我意识不到强行国产化的其它意义。
9月15日:讲个笑话:Truffer举办了一个比赛,赛题是用C#做2000*2000 double矩阵乘法。相关文件最后一行是:* 本活动最终解释权归北京联高软件开发有限公司所有
truffer的法务部门大概是可以辞职了。
9月4日:Truffer有了自己的官网http://truffer.cn/。我将持续跟踪其进度,直到我和truffer之一被打脸。
9月1日:Truffer在评论区自称实现了各种功能,但是没给出什么证据。期待一个证据或者内测人员评价。
7月12日:没想到Truffer还能继续宣传。别的不提,毅力和耐心值得支持。重新开放评论区,欢迎Truffer对本回答中各种观点进行反驳和批评。
6月28日修改:
先把话说死:Truffer是开空头支票的骗子,它开发团队的能力远不足以替代Matlab。我之前总想着给Truffer留余地留面子,话不说死,结果总有些非专业人士意识不到问题严重性,还在那儿支持Truffer,说要按市场规则行动。
大家批评Truffer,是在把伪劣产品驱逐出去,这种产品进入市场只会搅混水,希望后续看到这个答案的人能理解。
答主被气死了,好声好气写回答还要被喷。答主关闭评论区了,咱们有缘再见。希望Truffer将来能有幸打我的脸。
(注:不同意对本回答的任何形式的转载。让Truffer抓紧凉掉,不要给它增加热度了。)
6月25日第二次修改:
可能前一次修改的语气过于和缓,还有一些同学对Truffer抱有幻想。实际上在它主动把三份源代码用邮件发出去之后,子弹就已经落地飞不动了,只不过我们暂时没听见枪声。所以现在给出一份详细一点的代码分析,希望大家放弃幻想,回去工作。
下文主要分三个部分,大家可以按需阅读:
一、证明我收到了源文件;
二、给出我的一些观点;
三、列出其中一个文件的成员变量和方法列表。
一、证明我收到了源文件
我是从评论区的 @聿东君 那里获得的源码,大家可以看到评论区有几条删除的回复,是我和他交换邮箱之后为了保护隐私删除的。聿东君大佬应该是把从Truffer那里收到的邮件直接转发给我了,所以我还能看到原始的邮件如下。
中间的内容就不截图了。Truffer的态度还是很诚恳的,你们有兴趣可以自己找别人要一份原始邮件看看。移步下面的回答获取代码及更多分析(大佬nb)。harryzhou:如何评价国产软件 TRUFFER(可替代 MATLAB)?www.zhihu.com
6月25日10:30新增源代码:租了个临时服务器把源代码和邮件放上去了。http://139.180.213.30/。因为不想暴露隐私,所以我没敢用百度网盘(所以我当初为啥要实名)。这个服务器就非常菜,既不安全,负载能力也不高,因为我也不是这个专业的。等这个问题热度下去,我就把服务器给关了,你们想要看源码的就现在临时用用吧。
然后就是我拿到的源代码截图。
三个源文件分别是CMatrix.cs,Complex.cs,Matrix.cs。按照Truffer所说,分别是复数矩阵、复数和实数矩阵的基本运算。看内容基本对的上。(吐槽一下,CMatrix.cs和Matrix.cs都是UTF-8 with BOM编码,到了Complex.cs又变成GB2312编码,这算怎么一回事嘛?)
以上内容表明我确实收到了Truffer发送的原文件。如果Truffer不赞同此观点,认为文件被恶意替换,欢迎在评论区指出错误。
二、我的一些观点
首先,
反对这个问题下面所有声称Truffer套壳Octave的回答!
反对这个问题下面所有声称Truffer套壳Octave的回答!
反对这个问题下面所有声称Truffer套壳Octave的回答!
我不确定他们是如何获得了一个可用的软件,但我确实没在Truffer分享的三份文件中找到任何Octave相关的痕迹。我很确定全部内容都是他们自己写的,因为三个文件加起来只有3000行左右。下面给出了行数的截图。
如果这个回答下面包括勃勃在内的人,手中拥有套壳或抄袭证据的话,希望能分享出来。否则,希望你们向Truffer道歉。Truffer的软件确实做的不怎么样,来知乎上招摇被骂也无所谓。但是,捏造罪名、恶意构陷,或跟风骂人、落井下石,实非正义之举。
回到正题。其次,这些文件是极其不完整的,没有实现矩阵运算的基本功能,在效率方面也极其低下,不能作为科学计算库使用。如前一次修改所说,Truffer没有实现矩阵求逆、SVD分解、QR分解、特征值等基本操作,具体的情况大家可以移步下文三、CMatrix.cs的成员变量和方法列表来查看。作为对比,我给出我大二所修的数值计算方法课件,以说明至少应该包括哪些功能。
甚至连Truffer已经实现的内容,在可扩展性、易用性方面也令人担忧。其一,矩阵的设计中不包含stride,broadcast,view等功能,只是单纯的二维数组,不能扩展到n>2维的情况。
从目前常见的numpy、Matlab、Octave、tensorflow、pytorch这些库来看,使用n维数组是一个基本的要求,因为数组的reshape、permutation都是科学计算中的常规操作,vectorize是常用的加速方法。我能想到的只支持二维数组的库是Eigen3,但Eigen3有其特殊性所在:它是C++的库,而C++的循环代价极低,所以可以由使用者来进行循环。Eigen3付出的代价就是代码简洁性降低。
Truffer作为一个意图取代Matlab并以简单好用为目标的软件,没有使用n维数组而使用二维数组,实在是有些令人惊讶。我不知道是因为Truffer的开发团队之前根本没接触过科学计算,还是有什么特殊的考虑,希望他们有机会能解释一下。
/// /// 重载乘法运算符/// Mc = Ma * Mb/// /// 矩阵/// 矩阵/// public static CMatrix operator *(CMatrix Ma, CMatrix Mb)
{
if (Ma.Columns != Mb.Rows)
{
throw new Exception("ERROR CMatrix 06:矩阵不匹配");
}
CMatrix p = new CMatrix(Ma.Rows, Mb.Columns);
for (int i = 0; i < p.Rows; i++)
{
for (int j = 0; j < p.Columns; j++)
{
Complex sum = new Complex(0, 0);
//第一个矩阵的第i行乘以第二个矩阵的第j列for (int k = 0; k < Ma.Columns; k++)
{
sum += Ma[i, k] * Mb[k, j];
}
p[i, j] = sum;
}
}
return p;
}
其二,如上面的代码块所示,Truffer的乘法实现使用的是最简单的
。(括号里内容是错的:我在源文件中没有发现Strassen算法的实现,这在处理大规模矩阵方面会是很大的缺陷。不了解Strassen算法的可以移步下面的链接。)https://zhuanlan.zhihu.com/p/78657463zhuanlan.zhihu.com
订正:评论区大佬指出了我的错误。目前的科学计算软件并没有使用Strassen算法,而是用内存布局的优化+BLAS的方法。简单搜索一下,确实如此,相关链接如下。Matrix multiplication time complexity in MATLABstackoverflow.com
我在此向所有被我误导的人和Truffer道歉。但是吧-_-Truffer这个暴力循环,仍然是效率比较低的做法。还是希望Truffer多考虑考虑调用openblas之类的开源库做计算。openblas应该称得上是国产高性能计算库,而且还支持龙芯。Truffer调用这个库既能节省自己的开发时间,也不影响国产和自主研发的优势。希望Truffer团队考虑一下这个建议。An optimized BLAS librarywww.openblas.net
其三,前面harryzhou提到的FFT的问题(老夫的蝶形运算呢?)。详情请移步harryzhou的回答,前文有链接。
综上所述,Truffer在矩阵运算的路上才刚刚踏出第一步。这个时候自称一年替代Matlab、三年替代Simulink,实在是为时过早。还是希望大家都能脚踏实地,少说多做,做了再说。至少立党老师的hedgehog比Truffer的完成度要高得多。(虽然我不太看好JS在科学计算方面的应用)希望Truffer能继续努力,不断改进,首先超过hedgehog,然后再超过Octave,最后达到和Matlab媲美的水平。
6月25日11:00新增:对此问题下其他一些回答的看法。
首先,感谢YANG大佬的提醒(我为啥没法@他)。立党老师的hedgehog中,只实现了二维数组的加减乘,调用math.js实现了矩阵求逆,调用gpu.js实现GPU加速。而且与Truffer类似,没有实现SVD分解、QR分解等功能。emmmmmm我不做啥评价,我也不熟悉JS,有大佬自己去研究一下立党老师的github仓库吧。(serverless的想法倒是很有趣,但我仍然不看好JS做科学计算,好歹也上个rust吧?)
第二,为啥其他回答口径惊人地一致,认为Truffer套壳?我目前看到的代码表明,Truffer没有抄袭、套壳。代码在harryZhou的回答和我的回答里都有链接,请翻阅前文寻找。所以勃勃、立党老师他们到底掌握了什么证据?到现在也没有看他们放出实锤。就,就很迷。(此处应有一个表情包,但是我没有)
三、CMatrix.cs的成员变量和方法列表
跟据三个文件的描述来看,CMatrix.cs应该是结合了Matrix.cs和Complex.cs的功能,所以我在这里就只列出CMatrix.cs的情况了。
成员变量Rows:行数
Columns:列数
Elements:矩阵内元素,一维数组
_length:数据长度。
_length有一个getter,第一次调用会计算Row*Columns并保存结果。
方法
(说实话我也蛮菜的,这里就照搬一下源文件的注释内容了,括号里的内容是我自己的评论)构造函数:构造空矩阵
由Complex转化为1x1矩阵
由实矩阵转化为复数矩阵
由实部矩阵和虚部矩阵组成复数矩阵
构造m*n的矩阵,不赋值
构造m*n矩阵,用初值a填充
构造m*n矩阵,用长度为mn的两个一维数组(实部数组和虚部数组)填充
构造m*n矩阵,用长度为mn的一维复数数组填充
从二维复数数组构造CMatrix矩阵
复制构造函数
clone()方法(返回自身的一个拷贝)
一维索引和二维索引(没有stride和view)
运算符重载加法:矩阵+标量,标量+矩阵,矩阵+矩阵(不能broadcast)
负号
减法:矩阵-标量,标量-矩阵,矩阵-矩阵
乘法:矩阵*标量,标量*矩阵,矩阵*矩阵
除法:矩阵/标量,标量/矩阵
GetHashCode()
Equals()
==,!=
扩展方法提取矩阵实部、虚部
提取子矩阵(构造新矩阵并赋值)
判断是否是向量(行数或列数为1)
矩阵转置(构造新矩阵并赋值)
在上下左右增加新行、新列(为成员变量Elements重新分配空间,并把旧的复制进来)
删除行、列(构造新矩阵并赋值)
局部替换(将一个子矩阵替换为新的内容)
矩阵与矩阵的逐元素加减乘除(不能broadcast)
复数矩阵逐元素取模、取辐角、计算正弦、余弦、对数
共轭矩阵
LAPACK,MATLAB方法(注:LAPACK哭晕在厕所)取下三角矩阵、上三角矩阵
左右翻转、上下翻转(构造新矩阵并赋值)
reshape()
逆时针旋转90°(构造新矩阵并赋值)
repeat()
concatnate()
向量乘法
矩阵各方向循环移位(构造新矩阵并赋值)
reduce sum & reduce product
计算各列几何平均、调和平均数
快速傅里叶变换
6月27日04:00修改:悄悄更新一波希望没人发现。
我把50%的Truffer函数用C++实现了一下,大概花费了5h时间,放在了http://139.180.213.30/FuckTruffer/里面。复现它的目的很简单,就是证明一下,Truffer目前的工作量是一个非计算机专业的研一学生可以在12h内完成的,我甚至还有时间把它的二维数组替换成多维数组。以后如果还有支持Truffer评论的话,看到这里可以思考一下,Truffer到底是不是一个值得支持的库、软件,我们是否应该在早期就淘汰掉这种团队以节省资源。
目前看来,做一个简单的复现在提升说服力方面是有效的,评论区的“演示名流”同学已经停止回复了,所以我也就暂停了相关的复现工作。如果后续还有人不服的话,我可以继续复现剩下的50%函数,但希望提出这种要求的人能同时给出一些相应的报酬,毕竟我还有本职的科研要做。而且我可以保证,在复现后50%函数的时候,我可以加入View的特性,避免反复拷贝的耗时(加个smart pointer就能做的差不多,复现前50%的时候主要是忘记了这一点)。
最后就是,这个C++复现代码写的太烂了……太丢人了……大佬看一看、笑一笑就好,不要深究,也不要鄙视我。
原始回答:
找了一下这个公司的官方网站。北京联高软件开发有限公司 Beijing Legal Software Ltd.www.legalsoft.com.cn
这个公司看起来还是很强的。团队人员只列出了三人,分别是23、25、30年编程经验,理论上来讲是大佬。旗下目前有四款产品,分别是多可文档管理、联高资产管理、数控加工仿真和“原本”小工具。其中多可文档管理的客户名单极其长,甚至还包括了中国科学院微电子研究所。
但是,这个公司目前已有的业务中,跟Matlab好像实在是搭不上边。数控加工仿真里面倒是实现了G代码仿真,但是G代码好像也不算是一门完整的编程语言。
这个公司之前实在是过于不显山不露水,以至于我现在搞不清它到底是一门心思深挖基础软件,还是过来蹭个热闹的骗子。有些细节问题上,比如网站上的大量中式英语表述和简陋的美工水平让我产生一些怀疑,但是这些细节不能作为证据。
我目前只能持让子弹再飞一会儿的态度。因为还没要到源码,我暂时不知道高赞的截图是从哪里出来的,确实如某个回答所说有可能是诬陷,所以得等拿到之后再仔细研究研究。
用一句老话结个尾:Talk is cheap. Show me your code.