罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已退役,不会更新。

MATLAB中非负最小二乘的简史

我在MathWorks的第一年(1987年!),我认识的一位教授联系上了我。他试图用非负约束解最小二乘问题。由于我的成长环境很好,我马上就知道从哪里可以得到一个好的算法

  • Lawson和Hanson,“解决最小二乘问题”,Prentice-Hall, 1974,第23章,第161页。

内容

Fortran语言代码

书中提供了Fortran代码,与我交谈的教授做了相当忠实的翻译,尽管MATLAB还没有转到声明。问题是,它不能正常工作。他让我看一看。我记得当时很兴奋,因为我爱nnlsL-H称之为算法。然而,翻阅别人翻译的Fortran语言很快就失去了它的活力。

让我给你一些关于Fortran代码本身的统计数据。

  • 总共326行
  • 大约150行评论
  • 留下175行可执行代码
  • 主要双while循环,约125行可执行代码(第83-289行)

顿悟时刻

拖延有时是有好处的。我没有通读m文件代码,而是逐行与Fortran进行比较,而是打开了算法的参考。以下是我的发现。

你看到我看到的了吗?我看到这个问题是用矩阵和向量来讨论的。嗯,也许我可以直接从算法描述实现它,绕过Fortran实现。我就这么做了。

MATLAB代码

MATLAB自带的函数nnls该公司最终更名为lsqnonneg并更新了一些代码,使其与我们的其他优化例程标准化。我在不到半天的时间里就写好了代码并运行起来,包括正确地处理教授发给我的例子,而这些例子在他翻译的代码中是不能正常工作的。

m文件的代码统计信息如下所示。

  • 总共206行
  • ~80行空白和注释行
  • 大约125行可执行代码,其中55行处理其他优化例程的公共基础结构,这些优化例程在Fortran中没有出现
  • ~50行用于主迭代循环(嵌套while-loops)

经验教训

  • 我从这次经历中重新认识到,在深入研究之前,值得回过头来思考一下代码和算法。我想在我的编程生涯中,我不得不多次学习这一点!虽然Fortran和m文件的两个版本都基于相同的算法,但我能够绕过编写的代码,并使用引用的矩阵符号编写一个版本。
  • MATLAB代码更短,尽管我相信有人会说它不是那么多短。
  • 当我写这个算法的时候,我真的陷进去了,因为我没有陷入循环,而是看着变量在活动集中进进出出。非常有趣的是,看到算法从一个不那么基本的层面工作,但仍然捕获所有细节。

介意分享一下你的经验吗?在思考一个算法时,不同于它被提出的方式,可以帮助你解决问题?加入你的想法在这里




使用MATLAB®7.3发布

|