是否有推荐的方法与C开发人员进行科学/工程编程的交流?


16

作为Web应用程序的后端过程的一部分,我有很多需要移植到C的MATLAB代码(执行速度对于这项工作至关重要)。当我尝试将此代码外包给C开发人员时,我假设(如果我错了,请纠正我)很少有C开发人员也了解MATLAB代码(诸如索引和内存管理之类的东西是不同的,等等)。我想知道是否有C开发人员可以向我推荐一个过程,以使我更好地交流代码的作用?

例如,我是否应该提供MATLAB代码并逐行解释它在做什么?或者,我应该只提供数学/算法,用简单的英语解释它,还是让C开发人员以自己的理解来实现(例如,我可以假设开发人员能够理解如何使用复杂的数学方法(例如,虚构的数字),如何生成直方图,执行FFT等)?

还是有更好的方法?我希望我不是第一个需要这样做的人,所以我想知道是否有C语言开发人员遇到了这种情况,并且可以分享任何传统的看法,他们希望如何转移这项任务?

预先感谢您的任何评论。


3
您是否尝试过仅使用MCC将Matlab代码转换为C?我认为它mcc -c matlabfile.m
威尔泰特

4
雇用程序员时,请指定他/她必须同时理解C和Matlab代码。考虑到速度,您可能应该使用C ++而不是C(一定要小心,它永远不会变慢,而且经常会变快)。
杰里·科芬

3
@willytate:这要求您具有Matlab编译器,它不会产生特别有效的代码,并且您可以编译的代码有一些限制。
乔纳斯(Jonas)

3
如果您使用C语言进行面向对象的编程,不仅使自己失去了让编译器进行额外的类型安全检查的机会,而且使编译器失去了进行某些无法轻易表达的优化的机会此外,使用C ++还增加了使用比您更聪明的人编写的库中的功能的机会。

3
是将大多数时间都花在了实际算法上,还是摆弄了文件,IO和解析?普通的C编码器将无法编写与MATLAB实现竞争的FFT和矩阵代码。如果解析,IO和文件修改是程序花费的时间,那么C程序员应专注于此,并编写可调用MATLAB库中函数的粘合代码。如果FFT /矩阵分解/ ODE解决是瓶颈,那么您必须找到具有大量数值方法经验的C程序员。
Charles E. Grant的

Answers:


15

我和您的处境相似,我也有人将我的Matlab代码移植到C ++。

这在很大程度上取决于代码的复杂性,C / C ++开发人员的技能水平以及他们对应该实现的内容的理解-它们越好,他们对问题的理解就越好,越多他们可以独立工作。

由于将Matlab代码直接翻译为C / C ++可能不是解决问题的最有效方法,因此我建议您很好地传达输入是什么,代码应该做什么以及应该作为输出返回什么。您还应该提供测试代码以确保其正常工作的方法-既可以帮助调试,也可以提供质量控制手段。最重要的是,您应该提供并解释Matlab代码,作为如何获得结果的粗略指导。

您应该能够假定开发人员知道如何构造程序以及如何使用调试工具。但是,您不一定能够假设开发人员知道如何在统计或(数学)优化方面拥有特定知识。因此,使用您的输入来调试这些部件将更快。

这可能有助于安排与开发人员的例行会议,以使“小事”对开发人员而言可能有些怪异,但在您将重要问题升级为大问题之前,可以向您发出重要信号。


+1,表示该软件具有有效的测试结果。将代码从Matlab移植到C / C ++很难,不知道结果是什么样子。
rjzii

12

我并不是说这适用于您,而是:大多数只在MATLAB中编写代码的人都会编写错误的代码。非常糟糕,格式,结构和文档都很差。

在这种情况下,使用MATLAB代码的唯一简单方法是运行它以验证移植代码的结果。仅在MATLAB代码的原始作者实际上死了或昏昏欲睡的情况下,才尝试对MATLAB代码进行反向工程而无需其他文档。另一方面,关于算法的写得好的数学论文通常比作者的研究生自己的实现更有帮助。

为了使移植您的代码的人更容易:

  1. 重构代码以确保将操作分解为不同的功能。MATLAB的“每个文件一个函数”的样式鼓励函数过长并包含太多操作。还要确保将重复的代码提取到辅助函数中,即使这会导致文件数量超出您通常希望在MATLAB项目中使用的文件数量。

  2. 解释代码中使用的任何幻数或常数,以及它们有效的条件。

  3. 记录代码的数据结构。MATLAB的“一切都是矩阵”样式与大多数语言有很大不同,这通常意味着您的数据结构是通过使用矩阵的方式隐式定义的。AC程序员将需要弄清楚如何设置各种结构并分配必要的数组,因此请确保清楚变量的含义和内部结构。

  4. 记录您的代码使用的算法。特别是,请确保清楚使用复杂的全数组函数和运算符时会发生什么,并确保C程序员可以访问有关比任何工具箱函数或标准库函数复杂的算法的引用。 BLAS功能。

  5. 记录您为使代码健壮而进行的所有操作,例如输入验证和错误处理。实现的方式可能与在C语言中必须实现的方式大不相同。编写MATLAB代码的学者很少会费心地学习诸如异常处理之类的知识。如果您没有做任何使代码健壮的事情,那么至少请记录下有关无效输入或有缺陷或部分数据的处理方法。

  6. 确保移植代码的人员能够将输出与原始MATLAB代码进行比较,并尽可能提供全面的输入测试套件和正确的输出。

  7. 如果进行移植的人员不了解数值分析,则需要监督移植过程,并确保您检查并理解C代码。对你们两个人来说都是非常有教育意义的。


我同意您的技术评估,并指出了要点(1-7),但是我认为“大多数只在MATLAB中编写代码的人”这一最高主题是不必要的,也是不正确的。

5
根据我的经验,使用MATLAB作为唯一编程语言的大多数人都是应用数学人员,对于他们而言,编程通常不过是达到目的的一种手段。他们没有动力去关心编程的实践,只关心编写正确的代码,而不关心好的或漂亮的代码。当他们共享他们的代码时,通常是要使用它,而不是阅读它-总是会有一篇论文来做解释代码的工作。如果您认为这是令人反感的(并非故意如此),那么您根本就不在乎那些不在乎的人的观点。

4
以我的经验,不良代码主要是由编写一次性代码的人编写的,即,一个人将针对一个问题使用(读取)的代码。编程语言无关紧要。作为一个主要在Matlab进行编程的人,对我而言,这种偶然性确实令人反感。
乔纳斯(Jonas)

作为一名EE,我主要希望编写MATLAB,并且我同意你的看法。它鼓励一种非常糟糕的编码风格,没有作用域,命名空间,组织成数据结构或良好的变量命名。一旦理解了矢量化,就不会真正对任何由此产生的聪明的单行奇迹发表评论。只是丑陋,低效的代码的巨大垃圾堆。
Milind R

4

编程语言比编写起来容易阅读。大多数具有少量经验的C程序员应该能够很好地阅读Matlab代码,并且可以访问参考,特别是可以访问Matlab程序员来回答他们的问题。任何种类的代码都比我们要处理的大多数需求少了很多。

如果他们拥有计算机科学或计算机工程专业的学士学位,他们可能会采用微积分,三角学和线性代数,但可能会感到生疏。除非他们进行大量的科学/数学编程,否则大多数C程序员都会知道FFT是什么,但很少或从来没有做过。您理想的候选人将拥有所有新鲜的想法,但是拥有学位的任何人都应该能够通过一些复习学习来处理数学。在这两种情况下,您都希望有人强调在可能的情况下尽可能地找到用于常见操作的现有库,而不是滚动自己的库。

即使在经验丰富的程序员中,能够优化算法执行时间的人才也相差很大。我建议您有一个面试问题来发现这一点。向候选人展示一个简单但故意低效的算法,并询问他们该怎么做。看看他们是否自行提高效率。问他们渐近复杂度是什么,应该是什么。问他们如何改写以提高效率。


3

不使用matlab编译器的财务原因是可以理解的。但是,您可以使用免费的scilab至C转换器。该程序将是

  • 使用M2SCI工具将您的代码从Matlab转换为Scilab ,
  • 使用“ Scilab 2 C”将Scilab代码转换为C ,
  • 交叉测试代码,
  • 使用探查器搜索需要肉眼观察的瓶颈。

理想情况下,在此过程中不需要任何Scilab知识,并且很容易花一些时间来尝试此解决方案(实际上,可能并不那么简单...)

注意:我没有尝试过,但是出于类似的原因,这是我设想的解决方案。


2

开发一个可以同时运行两个应用程序的良好测试集,然后查看指标。

这将极大地帮助您的开发人员测试其代码,并确保质量处于合理水平。


2

Jonas的精彩文章,特别是提供一种测试代码的方法。以下是一些其他建议:

  • 共享代码。考虑提供MATLAB源,但准备解释其结构或其他细节(从语法到您的个人风格)。C开发人员将希望认识到高级概念,算法和数学(并希望您注释了代码)。

  • 文档。拥有定义项目的清晰文档至关重要。毕竟,如果该人不熟练使用MATLAB,则代码可能不是非常有用的参考。

  • 锻炼人际交往能力。这也许很明显,但是在进行协作时要牢记一点,尤其是在这种微观层面上。因此,您应尝试从代码/文档中消除尽可能多的歧义。根据您在项目中的领导水平,您可能会发现自己在指导发展和让个人做出自己的贡献之间取得平衡。


1

除非您的C程序员使用正确的库,否则Matlab在处理诸如反转矩阵这样琐碎的事情上要好得多。天真的C展示。不够稳定。雇用C编码员会很昂贵。我会尝试将Matlab代码移植到scipy并比较速度,尝试使用Matlab的c编译器,或者...只是添加更多的硬件-它可能更便宜,更简单,更安全,更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.