長時間使用MATLAB會導致編程能力下降嗎?

信號圖像處理領域中,基本是MATLAB使用較多。最近用C++寫,發現很多函數都是MATLAB寫好的,導致C++做起來又麻煩又覺得似乎有些不夠順手(開始寫的是什麼都不會,感覺有點過頭了)。那麼,是否存在題目所描述這樣的事實呢?

這個題目不是為了爭執MATLAB和C++誰好或者誰不好的問題。例如我今天需要求的一個梯度函數,如果用MATLAB可以調用現成的庫函數(Python之類的也可以),但是C++和Java好像沒有現成的函數,我查到的一些用C++寫這個函數資料還是基於OpenCV寫的。所以如果我希望得到結果,MATLAB幾秒鐘的事情到C++可能要很久,但後者比前者對於函數和演算法的理解明顯更深刻——後者的演算法需要完全自己寫而前者包含了很多封裝函數。這就大致可以看出一些兩種語言的區別。


當你用慣了MATLAB後,覺得寫C不順手,我覺得原因無非是:

  • MATLAB的變數都是封裝好的類,有統一調用格式,不需要定義變數的類型,以及無須考慮數據的具體存儲方式(data layout)。
  • MATLAB里有大量封裝好的函數(MATLAB本身,各個toolbox以及積累十多年的廣泛的開源代碼,比如MATLAB Central和各個研究組的release)可以直接調用,非常省事。
  • MATLAB的可視化功能強大,你能在workspace里直接看到各個變數的值、數組規模的信息,同時還能配合plot等函數進行可視化,非常便於調試和debug。

但是這些造成「長時間使用MATLAB覺得寫C不順手」的原因卻正標誌著科學計算編程方式的進步。從上世紀到如今,人們為了進行科學計算所使用的主流編程語言變得越來越高級,從fortran到C再到Python。這個潮流說明,因為與時俱增的技術積累,人類所擁有的輪子數量的增加將人們從繁雜的底層中逐漸解放出來,從而使人們能更有效率地組合現有輪子編寫更複雜更大型的程序。君不見用MATLAB寫,從開始到debug結束,效率是用C寫的幾倍甚至幾十倍。

題主提到的編程能力的下降,只是對底層操作而言。比如題主的例子寫「梯度函數」(我不知道你具體說的是什麼),但是這樣的演算法肯定可以用MATLAB自己寫——你完全可以不去看MATLAB的實現函數而自己實現,所依託的僅僅是MATLAB的開發環境。這樣做同樣能起到鍛煉演算法的能力,更何況你無須因技術上的細節(比如為了寫一些基本函數/演算法而不斷調試,或為了實現一些轉換,或數據I/O而浪費時間)而被阻絆,使你能被mathematically/intelligently bounded而不是technically bounded,而前者才是真正使你懂得一個演算法的決定因素。

我能想到的用C而不用MATLAB的情況,一種是因為實驗室代碼古老且龐大,一些重要核心函數是用C寫的而需要在實踐中不斷調用/有一些bug而需要強行debug(不過這種情況一般都是寫個wrapper把核心函數包起來然後在MATLAB里調用以便可視化)。另一種情況是因為performance的要求而不得不涉及中低層,比如為了實現一個演算法的real time,對速度很有要求。這種情況寫了C順便還要上GPU,同時還要注意memory讀取存儲等等的細節,不斷對代碼進行優化。像這種特別的情況,用C相對MATLAB才顯得有價值。

離題一點點,我覺得知乎上一些人對MATLAB有誤解,總覺得MATLAB慢。但是要知道,MATLAB的代碼都是經過精心優化的,而且有著幾十年的技術積累。如果你的代碼不夠快,很可能是沒有用最有效率的方式implement。常見的比如沒有vectorized;不善於用reshape flip cat等;不會用bsxfun arrayfun;不知道parfor和gpuArray可以直接做並行而完全有效地利用你的計算資源;不知道MATLAB C code generator可以將你的m函數直接轉C如果你的函數用到的都是比較常用MATLAB函數;不知道用mex將計算瓶頸用C實現再在MATLAB里調用;不會用MATLAB profiler去分析你的程序瓶頸在哪裡;不熟悉已有的函數重新造輪子而你的輪子在大部分情況下都比MATLAB的built-in function慢得不是一點兩點;不會上MATLAB Central找開源代碼等等。


一覺醒來這麼多贊嚇尿了,而且主要贊我最後一句話?

怎麼總覺得我在黑VS呢,雖然VS黑點挺多的,可是我是真心覺得還蠻好用的啊,難道黑VS是「政治正確」?我又嚇尿了……

———————————————————分割線—————————————————————

我有一個神級印度同學叫Kumar,9年大摩dev,來我們專業「放假+換個口味」,第一次接觸matlab,跟我說了句這樣的話:

「U don"t need to learn matlab as long as u know math"

「It"s somehow independent to ur coding skills"

我這個弱逼一年前還不會寫所謂的硬code(就是Oop類),現在我硬code接觸的越多,越能理解他的話:寫代碼是一種能力,matlab(不算找bug的話)是完全另外一種能力

首先matlab管自己叫實驗室,而不是一個一般的IDE,我們都能感受到這種叫法隱含的「結果導向」(result oriented?)意義:

首先我用matlab干任何事的時候想的第一件事都是「如果這樣,值會怎麼樣?」 然後才考慮的是演算法,然後才考慮的是設計

啥意思?基本90%都在敲命令看各種值,然後合理了幾乎把我的有效命令在腳本里照抄一遍就是一段代碼

說通俗點,這就是個計算器,我再鍛煉我的數學思維,矩陣化思維,解釋目標值意義的思維,尋找目標的思維,從沒有想到:我在編程!

然而一在.net框架里寫點東西,我基本不考慮上面的東西,或者說

我的數值部分matlab早就解決好了

我在考慮什麼呢?

「這個變數申明了么?」

「我要不要來個bond class」

「這個method void好還是不void好?」

「用list效率高還是array?array是一開始就讓他足夠大還是,要不要resize?」

「我的結果用什麼形式儲存」

「要不要來個繼承或多態?」

我也從來不去想「我怎麼求這個期望?」(除非他過於簡單)

所以,我特別能理解一部分matlab用戶和一部分硬程序員(加下劃線以免引戰)之間互罵

說俗了數學工作者和程序員之間存在一些「不可調和的矛盾」,而且這兩類語言互相有挺高的轉換成本

一言以蔽之:

知道自己的任務或目標就該用啥用啥,放心大膽的用,不用考慮編程能力下降什麼的

最後c#的IDE真的是我用過最強大的IDE


題主改了問題了,懶得改內容了,大家隨便看看吧

--Update- End-

程序員的問題,往往只需要回答一個關鍵字就可以了。

如果你當面問我這個問題,我大概只會說這麼一句話

「你可以去找下Opencv的資料」

不過考慮,大家都是通過鍵盤溝通,還是略微詳細些比較好。

C++,Matlab,是我的語言背景之二。其他的和本問題無關,就不說了。

C++只要用於編寫圖像分割和識別的代碼。

Matlab,主要用於編寫圖像分割的模擬演算法。

Matlab的基礎功能,特別是矩陣的處理是非常爽的。C++原生的庫,是沒有這樣的功能的,類似的也就是一個多維數組。

我在其他類似的問題里偶爾有說道一些,懶得重新寫了,直接引用吧。

在這個問題里,研究生編程一直無法入門心灰意冷怎麼辦? - 丁衛鋒的回答,我大致說了下Matlab和C之間的差異,所以不建議問問題的同學直接用C語言去處理一些基礎性問題。因為解題思路實在差異比較大。

而這個問題,隨著代碼越寫越多,發現數學功底嚴重不足,年紀已經35了,請問有什麼好書可以推薦彌補下數學功底嗎? - 丁衛鋒的回答

是如何用論文找相關演算法的。當然因為問題無關,我沒說,我主要找的是圖像處理相關的論文。

於是,一個關鍵問題就是:如何從圖像處理的Matlab模擬代碼轉換成C++代碼呢。

那麼答案就是 OpenCV庫

OpenCV (Open Source Computer Vision) is a library of programming functions mainly aimed at real-time computer vision, originally developed by Intel research center in Nizhny Novgorod (Russia), later supported by Willow Garage and now maintained by Itseez.

[1]

The library is cross-platform and free for use under the open-sourceBSD license.

Opencv庫中的Mat類,也就是矩陣對象,它的一些基本操作和Matlab的矩陣操作是非常的類似的。

比如加減乘除的一些操作。

下面一些sample可以簡單看下。

Mat D (A, Rect(10, 10, 100, 100) ); // using a rectangle
Mat E = A(Range::all(), Range(1,3)); // using row and column boundaries

Mat E = Mat::eye(4, 4, CV_64F);
cout &<&< "E = " &<&< endl &<&< " " &<&< E &<&< endl &<&< endl; Mat O = Mat::ones(2, 2, CV_32F); cout &<&< "O = " &<&< endl &<&< " " &<&< O &<&< endl &<&< endl; Mat Z = Mat::zeros(3,3, CV_8UC1); cout &<&< "Z = " &<&< endl &<&< " " &<&< Z &<&< endl &<&< endl;

Mat的一些基本操作說明

  • Addition, subtraction, negation: A+B, A-B, A+s, A-s, s+A, s-A, -A

  • Scaling: A*alpha

  • Per-element multiplication and division: A.mul(B), A/B, alpha/A

  • Matrix multiplication: A*B

  • Transposition: A.t() (means A


    T

    )

  • Matrix inversion and pseudo-inversion, solving linear systems and least-squares problems:

    A.inv([method]) (~ A


    -1

    ) , A.inv([method])*B (~ X: AX=B)

  • Comparison: A cmpop B, A cmpop alpha, alpha cmpop A, where cmpop is one of : &>, &>=, ==, !=, &<=, &<. The result of comparison is an 8-bit single channel mask whose elements are set to 255 (if the particular element or pair of elements satisfy the condition) or 0.

  • Bitwise logical operations: A logicop B, A logicop s, s logicop A, ~A, where logicop is one of : , |, ^.

  • Element-wise minimum and maximum: min(A, B), min(A, alpha), max(A, B), max(A, alpha)

  • Element-wise absolute value: abs(A)

  • Cross-product, dot-product: A.cross(B) A.dot(B)

  • Any function of matrix or matrices and scalars that returns a matrix or a scalar, such as norm, mean, sum, countNonZero, trace, determinant, repeat, and others.

  • Matrix initializers ( Mat::eye(), Mat::zeros(), Mat::ones() ), matrix comma-separated initializers, matrix constructors and operators that extract sub-matrices (see Mat description).

上面的資料排版有些問題,詳細可以看這個地址:

Basic Structures

當然只是類似。但是這些類似之處,完全可以讓一個合格的C++程序員把不少的Matlab代碼轉換成C++代碼了。

如果你剛剛好是用來處理圖像的,那麼Opencv庫中可以找到大量的和Matlab庫圖像處理一樣的演算法。可以讓你度過一開始的困難時期。

我想這些信息應該對你有足夠的幫助了。

就到這裡吧。

謝謝,

祝你順利。


會,但是有失也有得,你的線性代數水平會提高。

一些程序員有種錯覺:我用的語言越難用,我優越感越強。

我用MATLAB用多了,python水平會下降嗎?

我用python用多了,C語言水平會下降嗎?

我用C語言用多了,彙編水平會下降嗎?

我用彙編用多了,扎紙帶水平會下降嗎?

別人關心的是你做出來的東西, 誰在乎你用的是什麼工具


大二就開始用matlab了,最開始感想跟題主一模一樣.

matlab用多了C就手生,C用多了matlab就手生,

期間各種類似這樣的吐槽:

"shit這兩個float數組怎麼不能直接乘啊"

"我就想把兩個向量拼一下寫一堆cat這幾個意思"

"配置個fft庫這麼麻煩!"

"寫個循環慢成狗!".....等等等...

你問我後來? 後來我習慣了....


每種語言工作範圍不一樣,matlab適合研究建模,內置各種演算法,學習起來快,複雜演算法很難入門,在實驗平台搞懂了原理,做生產級的產品時用運行效率高的如c++,java。研究時各種演算法方便實用,可以解決理論問題的實驗平台,各種論文資料多,不糾纏於細節,做實用產品時按產品語言來實現,兩者並不矛盾。matlab的各種內置高效率,資料豐富可以提高演算法學習的效率。以算用c++寫FFT,小波變換特別耗時間難調試,用matlab幾分鐘可以完成,但做產品c++有運行優勢。


1,工程師語言,重視的是邏輯過程,重視的是結果。

我要用磚頭蓋房子,而不是注重生產多少磚頭,怎麼更快的生產磚頭,再去蓋房子。我注重的是快速修一個結構合理的房子。

我不是專業燒磚頭的,我燒的不專業。Python並沒有比matlab好到哪,只是Python的磚頭供應商多了些。

2,C++等偏底層的語言,不錯,效率高。可以開發黑科技。

等等,我是聯想這種生產商,我公司沒必要閉環到生產晶元吧?我要的就是搭個盒子好看,買好晶元主板顯卡等,組裝一下。蘋果巨牛如斯,也不是回到了intel nvidia的懷抱。

3,matlab各種coder,可以滿足你生成c甚至生成cuda碼工業級應用等。效率嗎,我覺得我一個月也碼不出實現我工作里幾個控制系統的10行代碼完成的工作量,我覺得等待matlab完成的時間,我可以有更多時間看看我的研究本身,而不是糾結,是用二分法效率低,我要上牛頓迭代。

汽車工業已經有應用了,國內國外都有。

4,當然本來就是研究生產工具本身的,我真心推薦學習一下c++。比如構建一個cfd求解器。

看題主的目的就是要做個信號,控制。幹嘛自己開個磚廠。還不如多關心下,輸入輸出關係,控制目標有沒有更好的提法。


不要拿Matlab和C/C++比,這是兩個世界的東西。在特定領域(不是全部)干趴Matlab的對手是Python。

可以這樣說,只要你的判斷力不是弱智水平,一旦你覺得手頭上的工作需要上Matlab了,用C/C++是完全沒法寫的。

只說編程這一塊,Python加上Numpy,Scipy,Matplotlib後,無論是表達力還是易用性都吊打Matlab。如果你的工程代碼上了1000行,需要採用多文件結構,還需要發布demo等,用Matlab那酸爽,試過就知道...

Matlab的精髓在於圖形化界面讓你很容易各種tweak,以及Simulink讓你拖拖模塊迅速組個系統,請不要把它當做通用編程語言。


寫完Matlab再來寫其它語言會很爽,因為終於可以回到正常人思維,不用什麼玩意都想弄成個矩陣以追求速度,而且終於可以輕易控制變數類型,涉及到對象請的時候syntax也沒那麼腦殘。


老農不會在乎耕地的工具是否順手,正如同碼農也不會在乎用什麼語言去實現。都是工具罷了,拿著順手就好,不順手也能湊合用。


寫多了C語言,彙編能力變弱了。

寫多了更高級的語言,低一級語言的編程能力變弱了。

等程序員轉管理了,也可以看成用自然語言對人編程。

但工具只是工具,目的是解決實際問題。

以結果為導向,管他是叫小弟、用matlab、用Java、用彙編、插電線、用粉筆。。。

完成就好。


請個人幫你翻譯代碼即可


MATLAB 不會增加或者減少你編程能力。因為難以代碼解耦以應對各種詭異的需求修改下的代碼組織良好,MATLAB就不是個編程語言(當然 bash 也不是)

一個直觀的例子:

先做了個 EOF,你寫了個 MATLAB 程序 然後這個pattern 有問題你需要 weight 一下,你又改了一下,然後你subsampling一下看看robustness,你又改了一下。好了,我覺得這個問題也很有趣,你來個 svd 看看,別忘了 weight,好吧我改。哎呀呀,其他 timescale 也很有趣,你不同 timescale 做 average smooth 然後玩玩,MATLAB 又改了一下。好了我們看了一下表面的結果 ,但是我們現在想要看一下 vertical 的一個截面如何。好了去改吧。

別問我為什麼知道的,這是我的日常。很多做科學計算的都是會不斷出現詭異需求,於是要求程序有很高的解耦性。

1. 調庫並不會降低編程能力

2. 使用 MATLAB 需要記住很多很詭異的函數名,側面增進編程能力

3. 使用 MATLAB 也可以鍛煉你在一片混沌的代碼中 debug 能力

4. 如果你已經有很好的編程基礎,你是用不慣 MATLAB 的;所以不用擔心用多了 MATLAB 編程能力會變得糟糕

MATLAB 的代碼解耦做的非常的糟糕,也就是很難寫出易於修改和偵查的代碼,封裝和擴展也很令人感動。原因是 MATLAB 的函數參數多態他喵的依賴 nargin 和 nargout(輸入錯誤 寫error 也必須在這裡) ;並且喵的沒有(自己寫類型系統這種事我就當沒看到吧)

5. 使用 MATLAB,以適當方式編程的時候,可以增加等待結果的時間,這些時間可以讓你拿去看編程書。

6. Matlab 不鼓勵在編程開始的時候想好以後有哪些東西可能會被修改,於是在函數介面中留下修改餘地。

PS: 當然可以通過 duck typing 實現部分代碼解耦,但是幾個類別混在一起放在函數中依然很痛苦

PS: 我什麼我需要關心幾個類別放在函數裡面呢?因為常常你會在完成一個實驗時發覺有「做幾個這樣那樣的實驗做對比吧」。當然你可以寫成 fname1, fname2之類,但是一個更好的選擇是在函數中加

一個或者多個參數表明這個實驗的特點是什麼。

PS1: 沒錯,你可以專門寫一個包構建解決這類問題,然後想要通過 OOP 代碼解耦的時候用這個包處理類別和報錯。這個包的確不難寫,但是這麼做總讓人蛋疼

用了 Julia 之後我現在都很少擔心自己寫的函數輸入寫錯了,因為一般我能設計出輸入錯了直接報錯的函數


窮人飄過,交不起那高昂的使用費。還是python吧。


我感覺演算法水平沒有什麼下降

但是對C語言的熟練度倒是降的跟狗一樣,這個沒辦法


用慣了Matlab再用回C++寫OpenCV,唯一讓我明顯感覺退化的是debug能力,因為Matlab實在是太tm好用了啊,script隨便運行到哪裡都可以隨時查看任何你想查看的東西……

另外長時間使用Matlab,必定節省下大量的時間用於更高效簡潔的工程的方法論上,而不用把太多時間花費在語法細節、造輪子、調試和設計模式這些上面。


自動擋開久了也覺得不會開手動擋了


會!而且畢業後發現根本沒人用MATLAB,然後連MATLAB的編程能力一起退化了······


第一次去野外燒烤,我們三個大男人點火點了一小時,最後管別人借了一塊燒著的碳才算點起來了。長時間使用燃氣灶使我們的生火能力退化嚴重啊。


用多了MATLAB的後遺症就是為了開發效率都不想自己造輪子了。

一有需求就先看看有沒有對應的MATLAB函數。

需要兼顧性能的時候才會考慮python

回到題主的問題。對我而言,不會。

即使我已經很久沒寫過C++了,但底子還在。

語言特性可能會遺忘一些,但是思想是不會忘的。

你要讓我徒手寫個演算法或數據結構我肯定還是用C++


推薦閱讀:

為什麼不同的東西會有不同的學習曲線,難道不是任何知識都是越深入需要付出越多嗎?
如何編寫unix 程序防止殭屍進程的出現?
有中文計算機高級語言嗎?
C語言int x=4294967295;怎麼改代碼才能結果顯示為「4294967295」?

TAG:編程 | 圖像處理 | MATLAB | C |