하드 코어 프로그래머로서 MATLAB 및 R 생존 [닫기]


25

저는 하드 코어 프로그래머를위한 언어로 프로그래밍하는 것을 좋아합니다. (내가 가장 좋아하는 것은 Python과 D입니다.) MATLAB은 엔지니어를 대상으로하고 R은 통계 전문가를 대상으로하며,이 언어는 하드 코어 프로그래머가 아니고 하드 코어 프로그래머가 아닌 사람들을 위해 설계된 것처럼 보입니다. 나는 항상 그것들이 사용하기에 다소 어색하다는 것을 알았으며, 어느 정도까지는 왜 손가락을 넣을 수 없습니다. 다음은 내가 식별 한 몇 가지 문제입니다.

  • (모두) : 진정한 프리미티브가 없을 때까지 벡터와 행렬을 극도로 강조합니다.
  • (둘 다) : 기본 문자열 조작의 어려움.
  • (모두) : 해시 테이블 및 "실제"와 같은 기본 데이터 구조 (예 : 유형 매개 변수 및 중첩 가능 배열)에 대한 지원이 부족하거나 어색합니다.
  • (둘 다) : 코드를 벡터화하기 위해 뒤로 구부리지 않는 한 해석 된 언어 표준으로도 실제로 느립니다.
  • (모두) : 외부 세계와 상호 작용하도록 설계되지 않은 것 같습니다. 예를 들어, 둘 다 시작하는 데 시간이 걸리고 간단한 텍스트 필터 프로그램을 쉽게 작성할 수 있도록 설계되지 않은 상당히 큰 프로그램입니다. 또한 문자열 처리 기능이 부족하면 거의 표준 형식 이외의 파일 I / O가 거의 불가능합니다.
  • (모두) : 물체의 방향이 매우 느슨해 보입니다. 예, 할 수는 있지만 C의 OO보다 관용적 인 느낌은 아닙니다.
  • (둘 다) : 참조 유형을 얻는 명백하고 간단한 방법은 없습니다. 포인터 나 클래스 참조가 없습니다. 예를 들어, 자신의 링크 된 목록을 이러한 언어 중 하나로 롤링하는 방법을 모르겠습니다.
  • (MATLAB) : 여러 개의 최상위 기능을 단일 파일에 넣을 수 없으므로 매우 긴 기능과 잘라 내기 및 붙여 넣기 코딩이 가능합니다.
  • (MATLAB) : 정수는 첫 번째 클래스 유형으로 존재하지 않는 것 같습니다.
  • (R) : 기본 내장 데이터 구조는 너무 수준이 높고 문서화가 잘되지 않은 것으로 보이며, 유사하지만 하위 수준의 데이터 구조에 대한 경험을 감안할 때 기대했던 것을 수행하지 않는 것 같습니다.
  • (R) : 문서가 모든 곳에 퍼져 있으며 탐색 또는 검색이 사실상 불가능합니다. 심지어 나쁜 문서화로 종종 쓰러지고 여전히 상당히 알파 인 D조차도 내가 알 수있는 한 실질적으로 더 좋습니다.
  • (R) : 적어도 내가 아는 한, 좋은 IDE는 없습니다. 다시 말해, 작은 공동체를 가진 상당히 알파 언어 인 D조차도 더 좋습니다.

일반적으로, MATLAB과 R은 충분히 포괄적 인 라이브러리가 존재한다면보다 일반적인 언어로 된 오래된 라이브러리로 쉽게 대체 될 수 있다고 생각합니다. 라이브러리 작성자를위한 많은 기능이 포함 된 최신 범용 언어에서 특히 그렇습니다.

R과 MATLAB이 왜 그렇게 이상하게 보입니까? 이 언어가 하드 코어 프로그래머에게 이상하게 보일 수있는 다른 주요 문제가 있습니까? 그들의 사용이 필요할 때, 좋은 생존 요령은 무엇입니까?

편집 : 내가 얻은 답변 중 하나에서 문제가 나타납니다. 데이터를 분석 할 때 전체 파이프 라인을 통합하는 하나의 스크립트를 사용하는 것이 개인의 선호도가 높습니다. 이는 범용 언어를 사용해야 함을 의미합니다. 나는 데이터를 "정리"하기 위해 스크립트를 작성하는 것이 싫다. 그리고 나서 완전히 다른 환경에서 다시 읽을 수있는 스크립트를 작성하는 것이 싫다. 나는 내 작업의 일부와 완전히 위해 MATLAB / R을 사용하는 마찰을 발견한다. 완전히 다른 주소 공간을 가진 다른 언어와 나머지는 큰 마찰의 원천이 될 생각입니다. 또한 접착제 층이 존재한다는 것을 알고 있지만, 그들은 항상 엄청나게 복잡하고 마찰력이있는 것처럼 보입니다.


40
파이썬은 "하드 코어"프로그래머를 위해 작성 되었습니까? 언제 그런 일이 있었습니까?
TZHX

3
@TZHX : 좋아, 아마 하드 코어가 잘못된 단어 였을 것이다. 더 좋은 표현은 "프로그래머이고 프로그래머처럼 생각하는 사람들"입니다.
dsimcha

17
나는 "하드 코어 프로그래머"라는 용어를 정말로 싫어한다. 그것은 일종의 엘리트주의처럼 들리며,“일반 목적 프로그래머”라는 용어는 같은 포인트를 만들기에 충분했을 것입니다.
blubb

5
R과 Matlab이 하드 코어 프로그래머가 아니라고 불평하지만 R과 Matlab을 사용할만큼 하드 코어가 아니라는 불만이 있습니다. Algol 가족이 아닌 언어로 글을 쓰고 싶다면 그 용어로 생각해야합니다.
피터 테일러

5
내 두 번째 프로그래밍 언어는 어셈블리였습니다. 파이썬은 하드 코어가 아닙니다 . R 및 Matlab과 정확히 같은 수준입니다. 그것이 다르다고 가정하는 것은 파이썬 이외의 많은 것을 이해하지 않는 것입니다 ... 파이썬은 범용 프로그래밍에 환상적입니다. Matlab은 Mathworks가 쉽게 만들 수있는 많은 것들 때문에 훌륭합니다. R은 비교할 수없는 통계, 머신 러닝, 데이터 준비, 분석 및 시각화 도구 (통계)로 인해 훌륭합니다. Perl 's great b / c ... 저처럼하세요 – 그들 모두를 배우고 직업에 맞는 것을 선택하십시오. :)
Iterator 2018 년

답변:


29

대규모 프로그래밍이나 범용 언어로 일반 프로그램을 프로그래밍하는 데 필요한 사고 방식으로 도메인 특정 언어에 접근하는 것은 좋지 않습니다. 도메인에 따라 다르므로 가장 효율적으로 사용하려면 학습 곡선이 가파르고 불편한 마음가짐이 필요할 것입니다. Matlab에서 고도로 최적화 된 도메인 특정 코드 (예 : 효율적이고 깨끗한 OpenGL 코드 작성과 동일)를 작성하는 것과 동등한 코드를 작성하는 것을 고려합니다. 또한 다른 언어로 사용할 라이브러리로 점점 더 유용 해지기 시작했습니다. 예를 들어 http://www.mathworks.com/matlabcentral/fileexchange/12987-integrating-matlab-with-c

이 DSL에 다른 프로세스와 동일한 프로세스를 사용하십시오.

  • Matlab 또는 R을 사용하여 해결하려는 문제를 신중하게 선택하여 문제를 해결하는 데 가장 적합한 문제인지 확인하십시오. 예를 들어, Matlab을 사용하여 벡터를 조작 할 수 있습니다.
  • 일반적으로 솔루션을 혼합 / 매치하여 Matlab 또는 R에서 프로그래밍 한 부분을 처리하도록 만들어진 문제의 정확한 하위 집합으로 제한합니다.
  • 솔루션을 설계하고 구축 할 때 언어가 구축 된 도메인에서 일반적인 사용자의 사고 방식을 따르십시오. 예를 들어 Matlab 프로그램 작업을 시작하기 전에 세계에 대한 벡터 수학적 태도를 조정하십시오. 먼저 표준 수학 표기법을 사용하여 종이에 작품을 쓰십시오.
  • 편안한 작업 환경을 조성하는 데 필요한 추가 작업을 수행하고 DSL 표준과 다른 경우에도 작업 수행에 필요한 도구를 얻습니다. 예를 들어, emacs 사용자라면 emacs가 matlab 모드를 사용하여 작업을 수행하는 것을 고려하십시오. 다른 언어에 대해 설정 한 모드뿐만 아니라 작동하는지 확인하십시오
  • 전환 할 준비를하십시오. 특히 언어로 자주 돌아와야하는 경우 DSL에서 수행하는 작업이 도메인 별 작업에만 포함되어 있고 다른 언어로 쉽게 전환 할 수있는 안정적인 생태계를 구축해야합니다. 나머지 작업. 평소보다 자주 다른 시스템에서 DSL이 아닌 작업을 수행하는 방법을 찾아 보자.

3
당신이 말하는 것은 완벽하게 이해되며 일반적으로 Matlab 또는 R을 사용해야 할 때 내가하는 일입니다. 이것의 좌절스러운 부분은 여러 가지 언어를 여러 가지 방법으로 수행하고 여러 주소 공간을 통합해야하기 때문에 발생하는 마찰입니다. 일반적으로 이것은 임의의 지점에서 텍스트 파일로 물건을 덤프하고 다시 읽거나 부서지기 쉽고 추악하고 어려운 접착제 층을 사용합니다.
dsimcha

25

MATLAB에 익숙하지만 R에는 익숙하지 않다는 점을 언급하여이 서문을 시작하겠습니다.

MATLAB은 OO, 문자열 처리, 또는 사용자 정의 데이터 구조와 잘하지 않는 이유는이 아니에요이다 의미가 그 일을 할 수 있습니다. OO에는 많은 언어가 있으며 문자열 처리에서 잘 작동하는 언어가 많으며 미친 맞춤 데이터 유형을 지원하는 언어가 많이 있습니다. 그것들은 그것들을 위해 설계되지 않았기 때문에 행렬 곱셈에 능숙하지 않습니다.

MATLAB이 수행하는 벡터 및 행렬 연산을 최적화하는 것만으로는 사용자 정의 형식이나 포인터 또는 처리되지 않은 것을 처리하지 않고도 충분하지 않습니다 (어려웠 으면 비용을 많이 청구 할 수 없음). 기존의 범용 언어에 빠른 벡터 지원을 추가하는 것도 어려운 일입니다. 프로그래머가 거의 사용하지 않는 기능에 대해 큰 오버 헤드가 추가됩니다. 너무 적은 프로그래머가 링크 된 목록을 이해하고 고유 값 분해를 어떻게 사용할 것으로 예상합니까? ).

MATLAB은 과학자와 엔지니어가 행렬 곱셈 및 ODE 계산을 매우 빠르게 수행 할 수 있도록 설계 되었기 때문에 매우 친숙합니다. MATLAB은 "하드 코어"언어의 정의에 부응하지 않습니다. 파이썬이나 D의 관점에서 MATLAB에 대해 생각하는 것은 C의 관점에서 LISP 또는 Haskell 또는 JavaScript의 관점에서 Verilog 및 VHDL에 대해 생각하는 것과 같습니다. 그들은 다른 문제를 해결하고 근본적으로 다른 방식으로 문제 해결에 접근합니다. 공정하게 말하면, MATLAB은 도메인 별 언어의 관점 에서조차도 머리를 감쌀 수없는 기괴한 언어 디자인을 선택했습니다. 그러나 천문학자가 천체 X가 천체 Y에서 48.0 AU와 정확히 48AU 떨어져 있다고주의해야 할 특별한 이유는 없습니다.

고맙게도, 일부 라이브러리는 여러분이 제안한대로 정확하게 작동합니다 : 범용 언어로 과학 계산을 잘 지원합니다. 파이썬의 경우 NumPy / Matplotlib 이 있는데, 약간 거친 부분이 있지만 파이썬 내부에서 합리적인 MATLAB 기능을 제공합니다. 이와 같은 다른 프로젝트가 없었던 이유는 라이브러리가 MATLAB 및 FORTRAN으로 이미 다루어 진 시장을 작성하고 제공하기가 매우 어렵 기 때문입니다.

MATLAB 또는 R을 절대적으로 사용해야하는 경우 "하드 코어"프로그래머처럼 프로그래밍에 접근 할 수 없으면 "하드 코어"과학자 또는 엔지니어처럼 접근해야합니다. LISP를 들어, 재귀 생각합니다. MATLAB에서는 행렬 만 생각하면됩니다. 선형 대수 에 대해 학습하십시오 (주제에 대한 MIT 강의 는 훌륭한 검토입니다). 그렇지 않으면 MATLAB을 "생존"하는 유일한 방법은 루프를 벡터 연산으로 대체 할 수있는 시점이나 외부 제품의 고유 값을 찾는 문제가 줄어들 때를 인식하는 것입니다.


예, 전반적으로 Numpy / Scipy / Matplotlib을 좋아하고 MATLAB / R이 확실한 대안이 될 때마다 사용합니다. 이것에 대한 나의 유일한 불만은 MATLAB / R만큼 깊지 않으며 파이썬이기 때문에 여전히 느리다는 것입니다.
dsimcha

4
@ dsimcha, 이것은 실제로 잘못되었습니다 . 이 성능 연구에서 Numpy는 MATLAB과 동등하며 Pyrex는 C ++의 2 배 안에 있습니다.
wvoq

@ wvoq : 설명 : 파이썬 인터프리터가 Numpy가 아닌 느리다는 것을 의미했습니다. Numpy는 대부분 BLAS와 LAPACK의 래퍼입니다. 물론이 코드를 호출하는 데 여전히 고정 된 오버 헤드가 있습니다. Pyrex, Cython 등도 알고 있지만 도움이되지만 여전히 세밀한 수준에서 언어를 혼합하고 있으며 이는 여전히 마찰의 원인이 될 수 있습니다.
dsimcha

2
@ dsimcha, Numpy 호출의 오버 헤드는 실제로 일정합니다. 필자가 언급 한 성능 연구에서 C ++로 수십 분의 1 초를 얻고 있습니다. 이 시간은 작성 및 디버깅에 소요 된 시간과 BLAS 호출 디버깅에 소요 된 시간과 비교되어야합니다. 어셈블리에 모든 것을 쓰지 않는 이유를 묻는 것이 도움이 될 수 있습니까? 또는 어셈블리에서 머신 코드로 변환 할 때 고정 오버 헤드가 추가되므로 스트레이트 머신 코드까지도?
wvoq

3
@dsimcha 허? 모든 것을 하나의 (빠른) 언어로하고 싶습니다. 파이썬을 가장 좋아하고 파이썬이 느리다는 것에 대해 불평하고 있습니까? 요점은 무엇입니까? MATLAB이 더 일반적인 목적의 기능을 가지고 해석 언어보다 빠르기를 원하십니까?
Chris는 Reinstate Monica가

14

"하드 코어 프로그래머"라는 용어를 반복해서 사용합니다. R과 MATLAB의 디자이너는 당신의 교묘과 함께 하지 , 아주 바보 나 파업과 심각하게 비판을하지 않는 사람을 권장합니다.

R에 대한 심각한 비판을 읽고 싶다면 R의 디자이너 중 한 명인 Ross Ihaka 가이 기사 를 읽는 것이 좋습니다. D 또는 Python 을 사용하는 것보다 R 을 디자인 하는 것이 상당히 어려운 것 같습니다 .


2
-1. MATLAB과 R의 디자이너가 아주 훌륭한 하드 코어 프로그래머가 아니라는 것을 의미하지는 않았습니다. 그러나, MATLAB 및 R은 설계되지 않은 위한 하드 코어 프로그래머.
dsimcha

3
"...이 언어는 하드 코어 프로그래머가 아닌 하드 코어 프로그래머가 아닌 사람들이 디자인 한 것 같습니다."
wvoq

6
"하드 코어 프로그래머"가 무엇인지 아직 명확하지 않았습니다. 예를 들어, "하드 코어"는 "C ++에 가장 익숙 함"을 의미하는 것처럼 들립니다.이 경우 R과 MATLAB은 정의상 하드 코어가 아닙니다. 거의 모든 예는이 분야의 전문가들이 왜 그런 식으로 구현하기에 적합한 지 묻지 않고 이러한 언어가 익숙하지 않은 불만으로 줄어 듭니다.
wvoq

1
또한 정의의 관점에서, 나는 그것이 명백하다고 생각했지만 "하드 코어 프로그래머"는 참조 / 포인터, 객체 지향, 람다 함수, 기본 데이터 구조 등과 같은 기본 프로그래밍 개념에 익숙하고 개발에 익숙한 사람 일뿐입니다. 범용 언어로.
dsimcha

2
우선, "하드 코어"는 "oo / procedural / functional programming에서 기본 개념에 정통한 사람"을 나타 내기 위해 꽤로드 된 용어입니다. 둘째, MATLAB을 말할 수는 없지만 R에는 이러한 모든 것이 있습니다. 유일한 차이점은 R에서 통계 어휘 요소가 기본 요소가되는 방식으로 문제를 해결하도록 언어에 의해 권장된다는 것입니다. 그 이유는 통계 학자와 머신 러닝 사람들이 종종 이런 식으로 쉽게 표현 된 문제로 작업하기 때문에 "더 어려운 코어"에 익숙하더라도 R을 자연스럽게 맞출 수 있기 때문입니다.
wvoq

9

진정한 프리미티브가 없을 때까지 벡터와 행렬을 극도로 강조합니다.

그것은 당신이 진정한 프리미티브라고 부르는 것에 달려 있습니다. R에서 벡터는 진정한 기본 요소입니다. 즉, 모든 변수는 벡터입니다. 마찬가지로 MATLAB에서 모든 변수는 행렬입니다.

기본 문자열 조작의 어려움.

MATLAB에서 문자열 조작은 강력하지만 코드가보기 흉하고 직관적이지 않다는 데 동의합니다 (적어도 지금은). R에는 stringr다른 언어의 도구로 사용하기에 좋은 패키지가 있습니다.

해시 테이블 및 "실제"와 같은 기본 데이터 구조 (예 : 유형 매개 변수 및 중첩 가능 배열)에 대한 지원 부족 또는 어색함.

R에서 벡터에는 해시처럼 작동하는 이름이 있습니다. 도있다 hashfilehash패키지. MATLAB 구현에 대해서는 확실하지 않지만 원하는 경우 JAVA 또는 .NET 버전을 쉽게 호출 할 수 있습니다.

코드를 벡터화하기 위해 뒤로 구부리지 않는 한 해석 된 언어 표준으로도 실제로 느립니다.

벡터화가 중단되면 (실제로 하드 코어라면 괜찮을 것이라고 확신합니다) 다른 언어로 돌아올 때 루프를 사용해야한다는 저주가 있습니다. 실행 속도는 프로그래밍 속도와의 균형입니다.

그들은 외부 세계와 상호 작용하도록 설계되지 않은 것 같습니다. 예를 들어, 둘 다 시작하는 데 시간이 걸리고 간단한 텍스트 필터 프로그램을 쉽게 작성할 수 있도록 설계되지 않은 상당히 큰 프로그램입니다. 또한 문자열 처리 기능이 부족하면 거의 표준 형식 이외의 파일 I / O가 거의 불가능합니다.

둘 다 거의 모든 형식의 데이터를 읽고 쓸 수 있습니다. 그들은 대부분의 다른 프로그래밍 언어에서 호출 될 수 있습니다. 또는 명령 프롬프트에서. 그들과 함께 GUI를 만들 수 있습니다. 그것이 외부 세계와 어떻게 상호 작용하지 않습니까? 텍스트 필터 프로그램으로 어려움을 겪고 있다면 stackoverflow를 요청하십시오.

물체의 방향이 매우 느슨하게 느껴지는 것 같습니다. 예, 할 수는 있지만 C의 OO보다 관용적 인 느낌은 아닙니다.

합의 그들은 주로 절차 적 언어입니다.

참조 유형을 얻는 명백하고 간단한 방법은 없습니다. 포인터 나 클래스 참조가 없습니다. 예를 들어, 자신의 링크 된 목록을 이러한 언어 중 하나로 롤링하는 방법을 모르겠습니다.

R에 동의합니다. MATLAB에서는 참조를 핸들이라고합니다.

하나의 파일에 여러 최상위 기능을 넣을 수 없으므로 매우 긴 기능과 잘라 내기 및 붙여 넣기 코딩이 가능합니다.

무의미한 말. 여러 파일을 만들면됩니다.

정수는 분명히 첫 번째 클래스 유형으로 존재하지 않습니다.

그들이하다. 참조 int8, int16, int32int64.

기본 내장 데이터 구조는 너무 수준이 높고 문서화가 잘되지 않은 것으로 보이며 유사하지만 낮은 수준의 데이터 구조에 대한 경험을 고려할 때 기대했던 것을 수행하지 않는 것 같습니다.

이들은 데이터 분석에 적합합니다. 예상치 못한 행동의 구체적인 예를 제시하십시오.

문서는 모든 곳에 퍼져 있으며 탐색 또는 검색이 사실상 불가능합니다. 심지어 나쁜 문서화로 종종 쓰러지고 여전히 상당히 알파 인 D조차도 내가 알 수있는 한 실질적으로 더 좋습니다.

많은 종류의 문서가 있습니다. 시작 ?some_function, RSiteSearch('some concept'), rseek.orgsos패키지. 설치와 함께 제공되는 설명서는 말할 것도 없습니다. 아니면 좋은 책 입니다.

적어도 내가 아는 한, 좋은 IDE는 없습니다. 다시 말해, 작은 공동체를 가진 상당히 알파 언어 인 D조차도 더 좋습니다.

Architect 또는 RStudio 또는 Revolution Analytics IDE를 사용해보십시오. 링크 및 추가 옵션 에 대해서는 스택 오버 플로우 정보 페이지 의 "R 용 IDE 및 편집기"섹션을 참조하십시오 .


3

MATLAB은 Java 및 C / C ++와 통합 할 수 있습니다. 이러한 언어로 모든 비 숫자 워크로드를 구현하고 MATLAB에서 호출 할 수 있습니다.

그들의 사용이 필요하다

왜 필요한가? 다른 사람들이 작성한 기존 MATLAB 코드 기반으로 작업하고 있습니까? 작업 요구 사항입니까? (또는 학교에있을 경우 수업 요건) 그렇지 않은 경우 대신 SciPy 또는 NumPy를 사용하는 것이 좋습니다.

불행히도, 개인적으로는 이런 상황이 누군가에게 강요된다면 항상 생존 할 수있는 것은 아닙니다. 대학에서도 모든 공학 학생이 MATLAB의 컴퓨팅 사고 방식에 익숙해 질 수있는 것은 아닙니다.


2
이러한 솔루션을 알고 있지만 상당히 거꾸로 보입니다. C ++, Java 등에서 MATLAB을 호출하고 싶습니다. MATLAB 이외의 것을 "드라이버"언어로 사용하고 싶습니다.
dsimcha

2
@dsimcha 당신은 C. 페이지에서 MATLAB 및 R 라이브러리를 호출 할 수 있습니다 mathworks.com/help/techdoc/matlab_external/f38569.html 또는 math.univ-montp2.fr/~pudlo/R_files/call_R.pdf
찰스 E. 그랜트

0

저는 MATLAB, Python 및 C (때로는 C ++)와 함께 일하며 데이터 과학자, 수학자 또는 기타 도메인 전문가 인 경향이있는 반대편에 앉아 소프트웨어 개발자라고 생각합니다.

C 또는 Python이라는 의미에서 범용 프로그래밍 언어가 아니라는 것을 처음으로 인정하지만 실제로는 시계열 분석 또는 이미지 처리와 같은 경우 MATLAB으로 스크립트를 작성하는 것이 좋습니다.

이 언어에는 일반적으로 상당히 비효율적으로 구현되었지만 사용하기에 즐거운 몇 가지 기능이 있습니다. 예를 들어, 논리 색인 작성 : 관심 영역을 선택하는 논리 벡터 또는 행렬을 작성하고 이름을 "isInROI"로 지정하여 해당 영역의 벡터 또는 행렬 "데이터"에서 요소를 선택하는 필터 조작을 수행합니다. "roiData = data (isInROI)"라고 간단히 작성하면됩니다.

MATLAB을 정말 고맙게 여기고 그 밖의 수많은 수많은 죄를 간과 할 수있는 것은 바로 이런 순간입니다.


NumPy와도 논리적 색인을 가지고하는 것으로 : docs.scipy.org/doc/numpy/user/...
jarondl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.