과학 / 엔지니어링 프로그래밍을 C 개발자에게 전달하는 데 권장되는 방법이 있습니까? MATLAB 코드를 제공하고 행 단위로 수행하는

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

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

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

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



답변

나는 사람들이 Matlab 코드를 C ++로 이식하게한다는 점에서 비슷한 상황에 처해있다.

코드의 복잡성뿐만 아니라 C / C ++ 개발자의 기술 수준과 구현해야하는 내용에 대한 이해도에 따라 달라집니다. 문제의 수준이 높을수록 문제를 더 잘 이해할수록 독립적으로 그들은 일할 수 있습니다.

Matlab 코드를 C / C ++로 직접 변환하는 것이 문제를 처리하는 가장 효율적인 방법이 아닐 수 있으므로 입력 내용, 코드 수행 내용 및 출력으로 반환되는 내용을 잘 전달하는 것이 좋습니다. 또한 코드를 테스트하여 코드가 올바르게 작동하는지 확인하기위한 방법을 제공해야합니다. 이는 디버깅에 대한 도움과 품질 관리 수단을 제공하는 것입니다. 또한 결과를 달성하는 방법에 대한 대략적인 지침으로 Matlab 코드를 제공하고 설명해야합니다.

개발자는 프로그램을 구성하는 방법과 디버깅 도구를 사용하는 방법을 알고 있다고 가정해야합니다. 그러나 개발자가 통계, (수학적) 최적화에 대한 특정 지식을 갖는 방법을 알고 있다고 가정하지 못할 수도 있습니다. 따라서 이러한 부분을 디버깅하면 입력 속도가 훨씬 빨라집니다.

개발자와의 정기적 인 회의 일정을 잡는 데 도움이 될 수 있으므로 개발자에게는 조금 이상하게 느껴질 수있는 “작은 일”이 있지만 중요한 문제는 큰 문제로 확대되기 전에 전달 될 수 있습니다.


답변

나는 이것이 당신에게 적용된다고 말하지는 않습니다. MATLAB으로 만 코드를 작성하는 대부분의 사람들은 잘못된 코드를 작성합니다. 형식, 구조 및 설명서가 좋지 않아 매우 나쁩니다.

이 경우 MATLAB 코드를 사용하는 유일한 쉬운 방법은 코드를 실행하여 포팅 된 코드의 결과를 확인하는 것입니다. 추가 문서없이 MATLAB 코드를 리버스 엔지니어링하려고하는 것은 MATLAB 코드의 원래 작성자가 실제로 죽었거나 혼수 상태 인 경우에만 수행해야합니다. 반면, 알고리즘에 대한 잘 작성된 수학적 논문은 일반적으로 저자의 대학원생이 구현 한 것보다 훨씬 유용합니다.

코드를 이식하는 사람이 더 쉽게 만들려면 :

  1. 작업을 다른 기능으로 세분화하도록 코드를 리팩터링하십시오. MATLAB의 파일 당 하나의 기능은 함수가 너무 길고 너무 많은 연산을 포함하도록 권장합니다. 또한 MATLAB 프로젝트에서 일반적으로 작업하려는 것보다 많은 파일이 생성 되더라도 중복 된 코드를 도우미 기능으로 가져와야합니다.

  2. 코드에 사용 된 매직 넘버 나 상수, 그리고 유효한 조건을 설명하십시오.

  3. 코드의 데이터 구조를 문서화하십시오. MATLAB의 “모든 것이 행렬”스타일은 대부분의 언어와 매우 다르며, 종종 행렬을 사용하는 방식에 따라 데이터 구조가 암시 적으로 정의됩니다. AC 프로그래머는 다양한 구조를 설정하고 필요한 배열을 할당하는 방법을 알아 내야합니다. 따라서 변수의 의미와 내부 구조가 무엇인지 명확해야합니다.

  4. 코드에서 사용하는 알고리즘을 문서화하십시오. 특히 복잡한 전체 배열 함수 및 연산자를 사용할 때 발생하는 상황이 명확하고 C 프로그래머가 도구 상자 함수 또는 표준 라이브러리 함수보다 복잡한 알고리즘에 대한 참조에 액세스 할 수 있는지 확인하십시오. BLAS 기능.

  5. 입력 유효성 검사 및 오류 처리와 같이 코드를 강력하게 만들기 위해 수행 한 모든 것을 문서화하십시오. 구현 방법은 아마도 C에서 수행 해야하는 방법과 매우 다를 수 있습니다. MATLAB 코드를 작성하는 학자는 예외 처리와 같은 것들에 대해 거의 신경 쓰지 않습니다. 코드를 강력하게 만들기 위해 아무 것도하지 않았다면 적어도 유효하지 않은 입력, 결함 또는 부분 데이터에 대해 수행 할 수있는 작업을 문서화하십시오.

  6. 코드를 포팅하는 사람이 출력을 원본 MATLAB 코드와 비교할 수 있는지 확인하고 가능한 경우 철저한 테스트 입력 및 올바른 출력을 제공하십시오.

  7. 포팅을하는 사람이 수치 분석을 모르는 경우 포팅 프로세스를 감독하고 C 코드를 검토하고 이해해야합니다. 두 사람 모두에게 매우 교육적 일 것입니다.


답변

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

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

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


답변

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

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

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

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


답변

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

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


답변

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

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

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

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


답변

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