有哪些讓人相見恨晚的 MATLAB 命令?


謝不邀
提問都說了是命令,大家回答那麼多函數幹什麼... 我來給一個超級大殺器

在命令行敲入 dbstop if error

如果運行出現錯誤,matlab會自動停在出錯的那行,並且保存所有相關變數。再也不用設斷點了有沒有!!!


Matlab裡面應該多用向量運算,把循環語句轉變為向量運算會省很多時間,程序也更簡潔易讀。

比方說,一個名叫array數組裡面,你要將裡面大於1的都變成0,就不必用到循環:

array(array&>1)=0;

把大於1小於3的變成0。

array(and(array&>1,array&<3))=0;

當然,還可以使用find,這個也很好用。

——————————————————————————————

另一個重要的技巧是delete/clf-plot-pause

用plot可以畫圖(注意記錄句柄),然後用delete刪掉特定圖象,或用clf清圖,再繪製,這可以在figure窗口產生動畫。但是如果只plot,往往只會在全部程序執行結束時顯示,這時候需要用pause讓figure完成圖像的更新。drawnow貌似也可以,但是我比較喜歡用pause,能夠簡單地控制動畫的速度。

這會方便調試和展示。這個技巧尤其適合使用matlab的圖形用戶界面設計功能時構造一個顯示運行狀態等信息的figure。

——————————————————————————————

mathworks 有一個fig函數(不是系統自帶的,是別人編寫的),可以很容易地調整字體、尺寸以及繪圖是否有邊框等等,不必畫出來再自己手動調整。這對於寫論文的人來說會很方便。

——————————————————————————————

善用eval,可以讓你的程序的靈活度大大加強。尤其是在變數名的問題上。當然,這可能會對代碼維護和調試帶來麻煩。很多情況可以用其他方法代替。 @王備 指出了一個鏈接,值得一讀Alternatives to the eval Function

——————————————————————————————

save、load可以將部分或全部變數、結構體等存入mat文件或從mat導入workspace

global可以將變數變為全局變數,在各函數之間共享。不過這不太好用,盡量慎用吧。

——————————————————————————————

exist可以檢測某目標(如變數)是否存在,減少一些麻煩。

——————————————————————————————

surf、mesh都很漂亮,不過surf之後記得用shading interp,看起來更漂亮。

——————————————————————————————

對於一些重複性的矩陣賦值,比如:1、2、3、4、1、2、3、4

可以使用repmat,將一個矩陣重複擴展為更大的矩陣。

——————————————————————————————

很多函數都有高級的用法,當使用到了,但又覺得有點麻煩的時候,不妨help一下,看看其他的用法。

總而言之,還是多上網搜索,一般問題總有很好的答案。


bsxfun
強大的、萬能的、不同維數的矩陣擴展混合運算,從此告別矩陣運算中的for循環
另,matlab里所有以fun為後綴的命令都很好用,arrayfun,cellfun,structfun,等等

@() 匿名函數
使用函數式編程,在編寫以數學公式為主的程序中比傳統編程方法好得多

set(gca,...)等
所有與畫圖相關的命令都包含了千奇百怪的屬性和參數,非常實用,如著名的 set(gca,...)

$ $
畫圖中的標題、注釋等文字內容是可以直接使用latex格式的,只須在包含latex命令的部分前後用$框起來即可

slice
高維切片,要在三維空間中表現三個以上變數的函數關係,必備此命令


  • 1.對兩路信號作圖時,可用 linkaxes 同步x軸,以便之後手動放大同步查看局部細節,例如:

ax(1) = subplot(2,1,1)
plot(time,signal1)
ax(2) = subplot(2,1,2)
plot(time,signal2)
linkaxes (ax,"x")

當然你也可以同步y軸:linkaxes (ax,"y") ,甚至兩軸都同步:linkaxes (ax,"xy") 。


--------- 更新1---------

  • 2. 相信很多人都知道hold on指令能用於作重疊的曲線圖,但當兩曲線值域相差太大時,以至於不能更好地展示彼此的細節,可考慮用如下方法(MATLAB 2016a 開始支持,低版本的用plotyy):

plot(time,signal1)
yyaxis right % 用右邊的y軸展示
plot(time,signal2)

偷一張MATLAB官網的圖來展示一下效果(侵刪)。此方法跟前面的linkaxes有些相似,然而linkaxes能展示多個曲線。linkaxes適合用於自己查看分析,本方法適合作報告節省空間。

  • 3.很多人提到多行注釋 ctrl + R 。但其缺點是不能摺疊。利用如下格式,可使注釋後的內容摺疊起來。

%{
可摺疊的注釋區域
%}

--------- 更新2---------

  • 4. 獲取當前路徑:path = pwd; 。獲取當前路徑所有文件及文件夾的名字:names = ls ;其實要想具體一點,用dir代替ls會更好:files = dir;

--------- 更新3---------

  • 5. 用 deal() 讓初始化更簡潔。

合併內容相同的初始化:

% 假如要初始化A,B,C和D為3*4階矩陣,平常我們會用如下代碼
A = zeros(3,4);
B = zeros(3,4);
C = zeros(3,4);
D = zeros(3,4);

% 利用deal()改造後,簡潔相當多
[A,B,C,D] = deal(zeros(3,4));

當然,初始化的內容不一定都相同,但是仍然可以縮成一行

% 如以下例子
A = zeros(3,4);
B = [];
C = ones(2);
D = cell(2);

% 可以用deal()改造,只是長一點
[A,B,C,D] = deal(zeros(3,4),[],ones(2),cell(2));

初始化結構體數組,當行數特別多時,優勢明顯

% 正常方法初始化3行,兩個field的結構體數組:
inl = {0, 0, 0}; % 必須得元胞數組,有些麻煩
s = struct("f1",inl,"f2",inl);

% 用deal改進
[s(1:3).f1,s(1:3).f2] = deal(0);

% 如果內容不一樣,就每個field分開來
[s(1:3).f1] = deal(0);
[s(1:3).f2] = deal(zeros(3)); % 把3改成任意行數n

--------- 更新4---------

  • 6. 大家覺不覺得每次用plot作圖返回的窗口都好小,每次都要手動按右上角的框框放大,賊煩~以下命令實現自動放大

% 以下代碼實現自動放大
fig = figure;
fig.Position = get(0,"ScreenSize"); % fig.Position這種操作好像MATLAB 2012還是2013之後才有的,忘記了,低版本用set吧
% % % % 我是分界線 % % % %
plot(1:10) % 隨便做個圖查看效果
zoom on % 順手加個放大,省得點工具欄

--------- 更新5---------

  • 7. 這個可能很多人知道,但是真的很好用。用『end』檢索最後一位元素

% 正常方法獲取向量V最後一位元素
N = length(V);
last = V(N);

% 用end的話方便很多
last = V(end);

% 還可以這樣
test1 = V(end-1); % 倒數第二個
test2 = V(1:end/2); % 獲取一半(奇數長度會有警告)

矩陣的用法差不多,就不舉例了

  • 8. 前面有人說過 dbstop if error。如果再配合兩把寶劍,會更好用:dbup 和 dbdown。

這兩個命令在程序錯誤並斷點之後在命令行輸入,用於在workspace間切換查看變數調試。dbup是跳到上層workspace,dbdown是返回。


說幾個很常用但容易被初學者忽略的吧。

1. 轉置但不共軛

b = a."

2. 得到列向量

b = a(:)

相應的,得到行向量就是

b = a(:)."

3. 清除並更新所有 class 的定義

clear classes

當你修改了某些 class 的定義時,需要調用此命令——僅僅 clear all 是不夠的。

4. 忽略某些返回參數

[~, idx] = max(a)

忽略最大值,只返回最大值的索引。
【注】
這種語法是在 Matlab 7.9 (2009b) 中引入的,在此之前的版本不支持這種用法。如果你使用早期版本,可以使用如下寫法:

[tmp, idx] = max(a); clear tmp

或者一句話搞定

[idx, idx] = max(a)

不過第二種寫法不見得每個人都會喜歡。

5. 去除長度為 1 的維度(常用於 3D 矩陣轉為 2D)

b = squeeze(a)

Simulink 的 save to workspace 模塊經常得到一個 [m x 1 x n] 的三維矩陣,直接使用非常不便。使用 squeeze 後,會將其轉換為 [m x n] 的二維矩陣。

6. 代碼運行耗時顯示

tic; some_code_to_run(); toc

tic/toc 會在 Matlab 命令行中列印出兩條命令之間的代碼的運行耗時。更詳細的代碼效率分析,可以使用 profile 命令。

7. 電腦跑分

bench

只能用於相同版本的 Matlab 下電腦之間的比較。

8. 記錄命令行命令

diary on
% Lots of my Matlab commands here.
diary off

使用 diary 好處是運行結果也會被記錄下來,並且以純文本方式存儲,方便編輯。更正式的報告,則推薦使用 publish。

9. 反轉向量

b = fliplr(a) % For row-vector a.
b = flipud(a) % For column-vector a.
b = wrev(a) % For any vector a.
b = a(end:-1:1); % This is the implementation of function wrev.

10. 去除數據中的 NaN

a(isnan(a)) = []

對於 inf 和 -inf,使用 isinf 命令。


使用Shortcut在編輯器裡面插入代碼或者字元串!
比如, 編輯器出現了警告, 我在語句後面寫入 %#ok, 就可以去除編輯器的警告

classdef Sub &< Base properties b end methods function obj = Sub(a, b) obj = obj@Base(a); obj.b = b; end function display(obj) %#ok fprintf("a = %f ", obj.a); fprintf("b = %f ", obj.b); end end end

後來一想, 總是這麼寫,不是辦法, 有沒有更方便的方法呢? 最好是通過Shortcut自動插入這個字元串,網上一查,還真有!
https://cn.mathworks.com/matlabcentral/fileexchange/41704-insert-a-piece-of-code--a-snippet--in-the-matlab-editor
對於一些常用的命令或者字元串, 只要點點滑鼠就OK了, 不需要鍵盤輸入了。


答個冷門的,未必人人都相見恨晚,但對於合適的項目還是有點用。

其實也很簡單,就是sound函數,能發出聲音,可以在程序跑完的時候來兩下。因為我的一個項目需要反覆跑程序調參數,程序跑一次從10分鐘到幾小時不等都有可能。很多時候電腦開著跑程序,我在旁邊干別的事,如果為了不浪費時間就要隔一會看看電腦跑完程序沒,覺得很煩。後來想到能不能讓電腦跑完主動告訴我?就搜到了這個函數。當然網上還有更高端的,程序運行到指定位置可以給自己的郵箱發個郵件,這樣只要在有網的地方就能通過手機之類隨時遠程獲知了。。。

然後覺得自己之前真是sb,為什麼早沒想到。。。

另外再補充一條:shutdown命令,可以自動關機,並且可以設置延時。很多時候為了趕時間,我都在睡前最後一次跑程序之前在程序末尾加上shutdown(當然之前還要加save),然後就可以呼呼睡大覺了,程序跑完會自動關機的。另外windows的命令框里也可以shutdown(可能就是從那裡來的),不過估計很少有人用。


bsxfun

絕對是向量化編程的利器,具體參見
科學網—Matlab中矩陣列向量歸一化的三種方法比較


1.freqz

2.fir1,fir2等一系列示波器構造相關函數

3.用text函數直接在figure中寫出latex風格公式;(有時Matlab/C風格的文本格式公式咋看之下太難懂)
比如說:

syms x;
text(.5,.5,["$",latex(x^(2*x^x+x/3)),"$"],"interpreter","latex","HorizontalAlignment","center","fontsize",18)

4.我寫過一個主要用dir,system,zip這幾個函數管理打包下載好的漫畫的小腳本。

5.其實工具也算是命令的封裝,常用並覺得好用的一般有擬合工具,小波等時頻分析工具,神經網路,還有射頻相關的小工具

6.快捷鍵ctrl+i,不算命令,我覺得不少人不知道這個

7. 開著電腦,matlab和音箱,然後在辦公室有人的時候遠程自己的電腦,讓自己電腦突然說話。。。【我覺得還是Mathematica的某個函數好使一些~】

sp=actxserver("SAPI.SpVoice");
sp.Speak("hello")

8.eval,比如可以輕易批量生成m1到m8這些具有規律的變數名


當然是 chebsnake 啊!

首先在command window (命令窗口)輸入 chebsnake.

Ready? Go!

是不是有種用回了最古老的諾基亞的既視感???

原來,MATLAB還可以用來玩貪吃蛇!!!

如果你想讓你貪吃蛇更搔首弄姿一些,不妨請試試在 Command Window (命令窗口)輸入

chebsnake ("equi")。

註:要想正常玩兒貪吃蛇,MATLAB里一定要有 Chebfun這個 package。Numerical computing with functions 這個官網上可以免費下載或者在command window 輸入以下code

unzip("https://github.com/chebfun/chebfun/archive/master.zip")

movefile("chebfun-master", "chebfun"), addpath(fullfile(cd,"chebfun")), savepath

那麼問題來了。

為什麼chebsnake("equi") 的貪吃蛇擺動幅度會比第一個大那麼多???

因為在估算函數的時候,chebsnake(『equi")是用的等距點(equispaced points interpolant),而第一個 chebsnake用的是切比雪夫點(chebyshev points)。

Chebfun用到的數學知識其實就是用來估算函數的數值演算法。這個Chebfun的項目是由牛津大學的 Lloyd N. Trefethen教授於2002年開啟的,最近幾年在數值估算領域很熱門,最新的版本Version 5.7.0於今年的六月2號剛剛發布。有興趣的話,可以關注Nick 在NYU 的講課視頻

註:轉載請聯繫答主

如果你對我關於數學方面的live 感興趣的話,請關註:

從趣味奧數到計量金融面試

如果你對我關於數學方面的回答感興趣的話,請關註:

有哪些學術性強的笑話/段子?

你最喜歡的數學定理是什麼?

如何評價清華附中校長王殿軍叫停女兒奧數?

為什麼做數學題時,自己想不出來,而翻到後面看答案解析時卻全都能能看懂?

你有哪些在考試或競賽中現場推導一條新定理,使用其答題並回答正確的例子?


答主從 Python 2.4.4 開始,除了興趣以外,在工作中放棄了其他編程語言(因為是電工不是碼農,對工具的選擇相對自由)。最近接手一個純 MATLAB 的項目,各種不爽了三個星期之後,對 MATLAB 終於好像有些開竅了,所以這裡要總結的不能算是「相見恨晚」,就算是(Python 經驗者的)快速上手指南吧。寫的也比較初級,還望各位大神不吝賜教。BTW,MATLAB 的工作結束之後又回歸了 Python,老是忘記下標從零開始有木有
(╯‵□′)╯︵┴─┴

首先是函數編程(Functional Programming)。函數編程的語言表現力的強大是眾所周知的,如Lisp, OCaml/F#, Haskell, Erlang 等,能以精鍊的代碼實現高效的程序(如並行等,當然了運行速度不一定最快),能使具體實現更容易接近概念設計,而且代碼優美易讀。而這一強大的表現力建立在幾大要素上,包括函數是第一等公民(First Class Function)、無副作用(Side Effect)的純函數(Pure Function)、柯里化(Currying)和偏函數(Partial Function)、模式匹配等等。

觀眾老爺:等等,那麼 MATLAB 可以做函數編程嗎?
答主:呃……很不幸據我所知還不行。
觀眾老爺:答主逗逼!那說這麼多有什麼用呢?(╯‵□′)╯︵┴─┴
答主:大夥息怒不要亂掀桌子⊙▽⊙我只想說被 Python 的 Functional Programming Paradigm 慣壞了的同學們,轉到 MATLAB 其實也還是能活下去的……

Python 的匿名函數很好用是吧,MATLAB 也有:

f = lambda x, y: x + y # Python

f = @ (x, y) x + y; % MATLAB

這個逗逼的加法函數然並卵,但是如果我有一個方程
f(mathbf{x}, mathbf{c})=0
其中mathbf{c}是參數向量,想在不同的參數下求解mathbf{x},匿名函數就會很方便了。

# Python
# ... 設 f 和 c 已定義
g = lambda x: f(x, c)
scipy.optimize.fsolve(g, 0)

% MATLAB
% ... 設 f 和 c 已定義
g = @ (x) f(x, c)
fsolve(g, 0)

等等這不就是偏函數嗎?You"re right! 在 Python 里我們可以 import functools 用裡面的 partial 造一個函數出來,跟用匿名函數的效果是一樣的。但答主更喜歡後者,好看!至於速度的問題,還真沒比較過。既然說道了 functools ,其實 MATLAB 里也是有的。

% MATLAB
% 比如我們定義一個函數
function func = partial(funcorg, varargin)

func = @ (x) funcorg(x, varargin{end});

end

% 然後有另一個函數
mylog = @ (x, b) log(x) / log(b);

% 就可以有偏函數
log3 = partial(mylog, 3);
log3(3)
% 輸出 ans = 1

當然啦,partial 里對 varargin 進行更多的處理的話,會得到更加強大的偏函數加工廠。然後聰明的觀眾老爺可能發現了 partial 返回一個函數,那麼這就是一個閉包(Closure)
了:因為 varargin 在 funcorg 的 lexical scope 里,也就相當於是 Python 里四種變數範圍「LEGB」中的 E。

然而這一切的一切是為了什麼呢?在不涉及面向對象編程(OOP)的情況下,由於匿名函數的存在,我們設計較大的程序也會有一些趁手的設計模式。舉個簡單的例子。我們要做一個優化程序,就假設使用遺傳演算法(Genetic Algorithm)吧(當然也要假設買不起 MATLAB 自帶的 GA Toolbox,或者需要高度定製一個),為了易於擴展,演算法的主要函數需要能接受匿名函數:

% MATLAB
% GA 演算法主函數的定義
function best = ga(objfunc, varargin)
% ...
end

% 調用的時候
best = ga(@ evaluator, someOtherArguments);

然後呢,函數要成為一等公民可以賦值,便於我們運用不同的操作:

% MATLAB
% GA 演算法主函數的定義,細化1
function best = ga(objfunc, operations)
% ...
end

% 調用語句
operations.PCrossover = .8;
operations.crossover = c16; % c16 是一個函數「把手」(後面再說)
operations.PMutation = .1;
operations.mutate = m16; % m16 也是一個函數「把手」
best = ga(@ evaluator, operations);

染色體有不同的編碼規則,如二進位、格雷碼、浮點數組、字元串等等,就算是二進位也有不同的位數的區別:

% MATLAB
% 二進位編碼:解碼器工廠
function func = decoderFactoryForBinary(nbits)

n = 2 ^ nextpow2(nbits);
if n &> 64
n = 64;
elseif n &< 8 n = 8; end switch n case 8 intMaker = @ uint8; intMax = intmax("uint8"); case 16 % ... end func = @ (b, lbound, ubound) decodeBinary(b, lb, ub, intMaker, intMax); end function r = decodeBinary(b, lb, ub, intMaker, intMax) % b - array of integers % lb - lower boundary, array of double % ... n = size(b, 1); lbs = repmat(lb, n, 1); bbs = repmat(ub - lb, n, 1); r = lbs + double(intMaker(b)) / double(intMax) .* bbs; end

算是一種 Factory pattern 吧(笑)。

當然也可以是 Decorator pattern,比如我們要喪心病狂地實現一個自己的 timeit:

% MATLAB
% 造個輪子
function func = mytimeit(f)

function results = wrapper(x)
tic();
results = f(x);
elapsed = toc();
fprintf("from mytimeit: %f seconds elapsed.
", elapsed);

func = @ wrapper;

end

% 用自己的輪子:
myexp = mytimeit(@ exp);
myexp(rand(10000));
% 輸出:
% from mytimeit: 0.463681 seconds elapsed.

沒有 Python 的裝飾器語法糖好看是真的(大笑)。

此外還有好多用法,比如把 function handler 裝在一個 cell array 裡面做 listener 之類的,就留給各位觀眾老爺自己去嘗試吧。

值得注意的是,在 MATLAB 中,(答主認為)函數並不嚴格算一等公民。函數「把手」(function handler——誰當初吧這個單詞翻譯成「句柄」的?)才是。由 function 定義的函數名是函數,不是一等公民,必須用 @ 符號轉換成 function handler,才能出現在賦值、其他函數的參數列表或者其他地方。而 @ () 定義的匿名函數,左值直接就是 function handler 了。函數和函數「把手」是有區別的,特別是對不帶參數的函數,如:

&>&> rand
ans =
0.1270

&>&> rand()
ans =
0.9058

&>&> r = @ rand
r =
@ rand

&>&> r
r =
@ rand

&>&> r()
ans =
0.9134

函數「把手」需要加括弧才是調用原函數。

呃。。今天先到這,點贊多的話,有空接著更⊙ω⊙


我說一個matlab的組件吧
matlab coder這個工具可以實習自己寫c語言程序然後編譯成matlab原生函數,或者把自己寫matlab函數編譯成c語言版的原生函數
這個功能的好處就是:
加速太多了!
加速太多了!!
加速太多了!!!
加速太多了!!!!
(很重要的事說四遍)

對於一個做matlab模擬,一個程序要跑幾小時甚至幾天的人來說,這是生命啊!這是長壽啊!


現在能想起來的sprintfc算一個,雖然是undocumented的


絕對的simulink啊 各種工具箱合集讓人懶到極致


補充
accumarray()


附件是一個針對整數的unique(),運行速度比原生 unique() 快60%

function [elements, counts] = intUnique(a)

a = a(:);

if sum((a)~=round(a))&>0
error("a must be int!");
end

offsetA = min(a)-1;
a = a-offsetA;
counts = accumarray(a, 1);

elements = find(counts);
counts = counts(elements);
elements = elements+offsetA;

end


matlab中可以使用和所在的操作系統平台的文件目錄相關的命令


beep on; beep; 運行完程序會 登 一聲提醒

load handel;
sound(y,Fs); 運行完幾聲haliluya


1. 關於向量化
大家都知道,如果用一個函數對一個矩陣中的每一個元素進行求值,那麼就要用到 .*, ./之類

function r = fmat(x)
r = x.^2 + 1./x;
end

A = [1 2 3 4];
fmat(A)

上面這樣就可以做到用fmat對A每一個元素分別求值。但不是所有的函數都像fmat這樣,下面這種情況就不行:

function r = fmat2(x)
if x &> 0
r = x.^2;
else
r = 1./x;
end

fmat2(A) % 會出錯

可以看到,因為上面fmat2 裡面有判斷語句,就不能把整個矩陣作為輸入參數。我知道的解決方法有3種:

% 法1
for i = 1:length(A)
r(i) = fmat2(A(i));
end

% 法2 用arrayfun
r = arrayfun(@fmat2, A)

% 法3 用邏輯矩陣

r = zeros(1,length(A));
l1 = (A&>0);
l2 = ~l1;
r(l1) = A(l1).^2;
r(l2) = 1./A(l2);

值得說一說的是第二種和第三種。arrayfun只是比用for更加簡潔,速度上沒有太大差別。但是,用邏輯矩陣的話,就比前兩種快10倍。邏輯矩陣是向量化的利器。比如 A&>0 就會返回一個邏輯矩陣,裡面全是1, 0 。並且, 邏輯矩陣可以當作索引, A(A&>0) 就把所有A&>0 的數返回。

2. 類型轉換
matlab中一共有4種類型:func(函數句柄), num(數值), sym(符號), str(字元)
- 在數值運算中,使用func, num
- 需要輸入輸出出,要用到str
- 進行符號運算(符號微分,積分)時,用sym

我們使用matlab,一般有這麼個過程:
- 先進行公式推導,這時要用sym, symfun類型
- 再進行數值計算,這裡要用普通的func, 和num 類型
- 最後與GUI界面交互的時候,要用str類型
這裡介紹幾個用於轉換的函數

str2func("@(x,y)sin(x*y)") % str -&> @func 返回一個函數句柄

syms x y
fs(x,y) = x^2+sin(x*y);
fh=matlabFunction(fs); % symfun -&> @func 返回一個函數句柄 !!!強烈推薦

fh = @(x)x.^2+sin(x);
fun2str(fh) % @func -&>str 函數句柄變為字元

3. 三維畫圖
大家都曉得,作圖第一步,對 x, y 劃分網格,用的是 meshgrid 。這樣畫出來的圖在一個立方體的範圍內,但是有時候我們要顯示一個圓柱體內的三維圖形這時候畫網格可以用 cylinder

[x, y] = cylinder(linspace(0,10,100),200) % linspace(0,10,100)指在半徑[0, 10]上劃分為100份,參數200指的是在圓周方向上 200等分
z = sin(x) + cos(y);
mesh(x, y, z);

4. 學無止境
學matlab,還是要去論壇,看看大神們的說法,大神們的做法。比如說1中的向量化

function r = fmat2(x)
if x &> 0
r = x.^2;
else
r = 1./x;
end

fmat2(A) % 會出錯

論壇中的大神的做法是這樣的

fmat3 = @(x)x.^2.*(x&>0) + 1./x.*(x&<=0); fmat3(A)

極其簡潔!!!我看到後非常佩服


先這些吧


不請自來

-----開始你的表演----

1.清除workspace中除了某些變數以外的其他全部變數

clear all使我們最常用的命令,但是這個是把workspace中所有的變數都清除了,有沒有辦法清除特定變數以外的其他變數?

clearvars -except VarA, VarB

就可以清除除了變數VarA和VarB以外的其他所有變數

適用於,我們在進行數據處理時,完成某一操作,想保留某些變數以便於後續的分析。

2.一個數組中,取除了某些元素之外的所有元素

使用setdiff函數

假設

a=1:100;b=[12 17 21 76];

因為某些原因我想取出除了b以外a中的其他所有元素,剩下的記為c

c=setdiff(a,b)

就可以實現了

3.快速對齊script

我寫程序有強迫行為,如果看到腳本沒有很好地對齊,比如說這邊多一個空格,我覺得挺不舒服的,所以就想辦法把代碼搞對齊。

Ctrl +A(全選)

Ctrl+i(快速對齊)

4.主程序與其子函數不在同一文件夾下,該如何操作才能正常運行主程序?

假設我我有一個script,裡面大概有十多個子函數,為了避免不必要的麻煩,我把主程序和子函數分開了,常見的是把子函數單獨放在一個文件夾下。如果你直接運行主程序,一定會告訴你某些函數或者變數未定義,如何解決這個問題呢?

方法一是,手動setpath把子函數放到搜索路徑中去;

方法二,使用addpath(subfolder name),一步到位,是不是很快?!

5.在當下路徑下生成一個文件夾

mkdir(fullfile(".foldername"))

生成一個名為foldername的文件夾,這個文件夾可以用來保存你打算保存的某些數據文件

6.找出某一路徑下的所有文件名

dir()

這個在對數據或者文件進行批處理時非常有用

7.關閉使用fopen打開的各種文檔

我寫實驗程序時,喜歡將被試者或者操作者每一步的操作都記錄在案,類似於Log,這個就需要我們用fopen先打開或者創建一個文本文檔。但是由於在debug過程中不可避免地犯錯而致使程序中止,想刪除這個已經打開的文檔,這個時候是刪除不了的,matlab總是提示該文件在使用中。那麼怎麼辦呢?fclose("all")就可以關閉所有已經打開或者創建的文檔了。

-----他山之石-----

我們來看看美國版知乎Quora上的回答是怎麼樣的。

What are some cool MATLAB tricks?

我朝其他論壇上的問答

MATLAB 有什麼奇技淫巧?

-----未完待續-----


1. 牛逼哄哄的notebook功能:
Notebook--matlab_了凡春秋

2. 高端大氣上檔次的GUIDE,老闆再也不用擔心我不會用uicontrol拼GUI了。

3. doc命令,我灰常喜歡。(help給的東西不太詳細)

4. type可以查看很多函數/命令的source code。

5. matlab.exe -regserver

6. 昨天用textread解析一個特定格式的文本文件,headerline參數可以讓我們跳過文件開頭指定行數,真是考慮得周到。有了textread,就不用fopen、fread、fscanf……這麼費勁了。


推薦閱讀:

如何對待逐漸疏遠的朋友?
如何看待一度在 QQ 空間很火的這則關於希特勒的洗白文案?
醫生接診醫生是怎樣一種體驗?
你讀過的最讓人心酸的句子有哪些?
如何看待部分母親帶小男孩進女更衣室換衣服的行為?

TAG:編程 | MATLAB | 終端命令 | 有哪些 X | 相見恨晚的X |