과학 / 엔지니어링 프로그래밍을 C 개발자에게 전달하는 데 권장되는 방법이 있습니까?


16

웹 응용 프로그램의 백엔드 프로세스의 일부로 C로 이식 해야하는 많은 MATLAB 코드가 있습니다 (이 작업에는 실행 속도가 중요합니다). 이 코드를 C 개발자에게 아웃소싱하려고 할 때 MATLAB 코드를 이해하는 C 개발자는 거의 없습니다 (인덱싱 및 메모리 관리 등이 다릅니다). 코드의 기능을 가장 잘 전달하기 위해 따라야 할 절차를 추천 할 수있는 C 개발자가 있는지 궁금합니다.

예를 들어, MATLAB 코드를 제공하고 행 단위로 수행하는 작업을 설명해야합니까? 또는 수학 / 알고리즘을 제공하고 평범한 영어로 설명하고 C 개발자가 자신의 방식 으로이 이해를 구현하도록해야합니다 (예 : 개발자가 복잡한 수학을 사용하는 방법을 상상한다고 상상할 수 있습니까 (예 : 상상의) 히스토그램 생성 방법, FFT 수행 방법 등)?

아니면 더 좋은 방법이 있습니까? 나는 이것을해야 할 첫 번째 사람이 아니길 기대하므로 거기에있는 C 개발자 가이 상황에 부딪 쳤는지 궁금해 하고이 작업을 어떻게 수행하고 싶은지 기존의 지혜를 공유 할 수 있습니까?

의견에 미리 감사드립니다.


3
matlab 코드를 c로 변환하기 위해 mcc를 사용해 보셨습니까? 나는 그것의 생각mcc -c matlabfile.m
윌 테이트

4
프로그래머를 고용 할 때 C 코드와 Matlab 코드를 모두 이해하도록 지정하십시오. 속도에 중점을 둔다면 C 대신 C ++을 사용해야 할 것입니다.
Jerry Coffin

3
@willytate : Matlab 컴파일러가 필요하고, 특히 효율적인 코드를 생성하지 않으며, 컴파일 할 수있는 코드에 대한 제한이 있습니다.
Jonas

3
C에서 객체 지향 프로그래밍을 수행하는 경우 컴파일러가 추가 유형 안전 검사를 수행 할 수있는 기회를 박탈 할뿐만 아니라 쉽게 표현 할 수없는 특정 종류의 최적화를 수행 할 수있는 기회를 컴파일러에서 박탈합니다 또한 C ++을 사용하면 누군가보다 똑똑한 사람이 작성한 라이브러리의 기능을 사용할 수있는 가능성이 높아집니다.

3
실제 알고리즘이나 파일, IO 및 구문 분석에 대부분의 시간을 소비합니까? 평균적인 C 코더는 MATLAB 구현과 경쟁하는 곳 어디에서나 FFT 및 매트릭스 코드를 작성할 수 없습니다. 구문 분석, IO 및 파일 fiddling이 프로그램에서 시간을 보내는 위치 인 경우 C 프로그래머는 그에 집중하고 MATLAB 라이브러리에서 함수를 호출하는 글루 코드를 작성해야합니다. FFT / 매트릭스 분해 / ODE 해결이 병목 현상이면 많은 수치 분석법 경험을 가진 C 프로그래머를 찾아야합니다.
Charles E. Grant

답변:


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에서 주로 프로그래밍하는 사람으로서, adhominem 은 공격적입니다.
Jonas

EE로서 나는 주로 MATLAB을 쓸 것으로 예상되며, 나는 당신에게 동의합니다. 범위 지정, 네임 스페이스 지정, 데이터 구조 구성 또는 변수 이름 지정이없는 매우 끔찍한 코딩 스타일을 권장합니다. 일단 벡터화가 이해되면, 그 결과로 생기는 영리한 한 줄짜리 말에 귀찮게하지 않습니다. 추악하고 비효율적 인 코드의 거대한 쓰레기 더미.
Milind R

4

프로그래밍 언어는 쓰기보다 읽기 쉽습니다. 경험이 많은 대부분의 C 프로그래머는 참조에 액세스하고 특히 Matlab 프로그래머에 액세스하여 Matlab 코드를 잘 읽을 수 있어야합니다. 모든 종류의 코드는 우리가 처리해야하는 대부분의 요구 사항보다 훨씬 덜 모호합니다.

컴퓨터 공학 또는 컴퓨터 공학 학사 학위를 취득한 경우 미적분학, 삼각법 및 선형 대수학을했을 가능성이 있지만 녹슬었을 수 있습니다. 많은 과학 / 수학 프로그래밍을하지 않는 한 대부분의 C 프로그래머는 FFT가 무엇인지 알지만 거의 수행하지 않아도됩니다. 당신의 이상적인 지원자는 자신의 생각에 신선 할 것이지만 학위를 가진 사람은 약간의 리프레쉬 연구로 수학을 다룰 수 있어야합니다. 두 경우 모두 가능한 경우 자체 라이브러리를 롤링하지 않고 일반적인 작업을 위해 기존 라이브러리를 찾는 것을 강조하는 사람이 필요합니다.

알고리즘 실행 시간을 최적화 할 수있는 재능은 숙련 된 프로그래머들 사이에서도 매우 다양합니다. 나는 당신이 그것을 발견하기 위해 인터뷰 문제가있는 것이 좋습니다. 후보자들에게 단순하지만 의도적으로 비효율적 인 알고리즘을 보여주고 그들이하는 일을 물어보십시오. 그들이 스스로 비 효율성을 불러 일으키는 지보십시오. 그들에게 점근 적 복잡성이 무엇인지, 무엇이되어야하는지 물어보십시오. 효율성을 개선하기 위해 어떻게 다시 작성할 것인지 물어보십시오.


3

matlab 컴파일러를 사용하지 않는 재정적 이유는 잘 이해할 수 있습니다. 그러나 무료 scilab-to-C 변환기를 사용할 수 있습니다. 절차는

  • 와 Scilab에 matlab에에서 코드를 변환 M2SCI 도구 ,
  • "Scilab 2 C"를 사용하여 Scilab 코드를 C로 변환하십시오 .
  • 코드를 교차 테스트하고
  • 프로파일 러를 사용하여 사람의 눈이 필요한 병목 현상을 검색하십시오.

이상적으로 Scilab에 대한 지식이 프로세스에 필요하지 않으며이 솔루션을 시도하는 데 시간이 걸리기 쉽습니다 (실제로는 간단하지 않을 수도 있습니다 ...)

참고 : 나는 이것을 시도하지 않았지만 비슷한 이유로 나 자신을 상상하는 해결책입니다.


2

두 애플리케이션을 모두 실행할 수있는 우수한 테스트 세트를 개발 한 후 메트릭을 살펴보십시오.

이를 통해 개발자가 코드를 테스트하고 품질이 적절한 수준인지 확인할 수 있습니다.


2

Jonas의 훌륭한 게시물, 특히 코드를 테스트하는 방법을 제공하는 요점. 추가 제안 사항은 다음과 같습니다.

  • 공유 코드. MATLAB 소스를 제공하는 것을 고려하지만 구문이나 개인 스타일에 이르기까지 그 구조 나 기타 세부 사항을 설명 할 준비를하십시오. C 개발자는 희망적으로 고급 개념, 알고리즘 및 수학을 인식 할 것입니다 ( 코드에 주석을 달기를 바랍니다 ).

  • 선적 서류 비치. 프로젝트를 정의하는 명확한 문서를 작성하는 것이 중요합니다. 결국, 사람이 MATLAB에 유창하지 않으면 코드는 매우 유용한 참조가 아닐 수 있습니다.

  • 사람들의 기술을 연습하십시오. 이것은 분명 할 수 있지만, 특히 이런 종류의 마이크로 레벨에서 협업 할 때 명심해야합니다. 따라서 코드 / 문서에서 가능한 한 많은 모호성을 제거해야합니다. 프로젝트의 리더쉽 수준에 따라 개발 안내와 개인이 개별적으로 기여하도록하는 것 사이에서 균형을 이루고 있음을 알 수 있습니다.


1

C 코더가 올바른 라이브러리를 사용하지 않으면 Matlab은 행렬을 거꾸로하는 것만 큼 사소한 것이 좋습니다. 순진한 C impl. 충분히 안정적이지 않습니다. C 코더를 고용하는 것은 비용이 많이 듭니다. Matlab 코드를 scipy로 속도를 비교하고 속도를 비교하거나 Matlab의 c 컴파일러를 사용하려고하거나 더 많은 하드웨어를 던져보십시오. 훨씬 저렴하고 간단하며 안전하고 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.