matlab错误原因,matlab常见错误分析
這里是幾個Matlab的小提示,基本上是我使用Matlab時碰到并解決了的問題,希望能使別人不要再碰釘子走彎路了。如果有建議或發現其中有錯誤,請與我聯系。
循環變量
由于歷史的原因,程序員們總是使用i,j,…為循環變量命名,但是在Matlab中這種習慣可能會導致一些很隱蔽的問題。因為i,j同時也是Matlab中的虛數單位,如果你給i賦值,就會覆蓋掉原來虛數單位的定義,例如:
4+i*3
ans =
4.0000 + 3.0000i
for i=1:10, end
4+i*3
ans =
34
在一段很長的程序中很難發現這個錯誤,因此不要用i,j作循環變量名,除非你確認在代碼的作用域內不會和復數打交道;或者使用4+3i這樣的復數記法;也可以換用j:
for i=1:10, end
i
i =
10
j
ans =
0 + 1.0000i
1i
ans =
0 + 1.0000i
4+3i
ans =
4.0000 + 3.0000i
循環
我經常看到一些Matlab初學者寫出帶有層層循環的代碼,這些代碼往往運行得很慢,而且非常難懂。Matlab提供了大量的命令來避免循環,我的建議是:在確定要寫一個針對矩陣操作的2重循環之前,請仔細閱讀幫助中的Maximizing
MATLAB
Performance一節。里面有很多例子,這里舉一個我自己碰到的問題。
要統計數字圖像的亮度最大值和最小值,由于數字圖像可能是一個二維或三維的矩陣,開始我寫出了如下的代碼:
switch ndims(img)
case 2
m = max(max(img));
case 3
m = max(max(max(img)));
end
后來我對這種做法很不滿意,如果有一個8維的矩陣,難道我要寫
max(max(max(max(max(max(max(max(x))))))))
才行?后來我發現無論矩陣是什么維數,實際上
max( x(:) )
就夠了。
符號運算
許多Matlab函數(特別是數值計算方面的)可以函數句柄(function
handle)或內聯對象(inline
object)作為參數。我們以quad函數為例,這個函數使用Simpson算法求函數的數值積分。它的一種調用形式是:
quad(fun, a, b)
其中,fun可以是指向被積函數的函數句柄,或者含有被積函數的內聯對象;a和b分別是被積區間的上、下限。考慮以下積分:
使用函數句柄的方法:
% 將下面到"% EOF"的代碼保存為f.m
function y = f(x)
y = sin(x) ./ x;
% EOF
quad(@f, 1, 2)
ans =
0.6593
使用內聯對象的方法:
quad( inline( 'sin(x)./x' )), 1, 2 )
ans =
0.6593
由于使用內聯對象不需要另外建立m文件,所以比較方便,建議使用這種方法。
更加常見的應用是被積函數有不確定的參數,例如:
其中參數a,b,K運行時確定,這時,使用函數句柄將顯得很麻煩,可以用以下的方法:
a = rand;
b = rand + 1;
K = rand;
y = subs('sin(K*x)/x', 'K', sym(K, 'd') )
quad( inline(vectorize(char(y))), a, b)
y =
sin(.79193703742703536185842949635116*x)/x
ans =
0.8188
當然,由于a,b,K是隨機數,結果是不確定的。
這里有有兩點需要說明:
第一,請注意sym(K, 'd'),如果直接使用subs('sin(K*x)/x, 'K',
K)或subs('sin(K*x)/x, 'K',
sym(K))的話,高版本的符號工具箱會將K盡可能化為分數,有時這是十分恐怖的,也許會得到:
sin(6649179754310225/9007199254740992*x)/x
這樣的結果。
第二,注意vectorize函數。sym對象重載的char函數會把數組的乘除(.*,
./, .^)化成矩陣的乘除(*, /,
^),vectorize會將字符串里的*,/,^全化成.*, ./,
.^,如果不這樣做,quad函數將會出錯,這個問題曾經困擾了我很長的時間:
quad( inline(char(y)), a, b)
??? Index exceeds matrix dimensions.
Error in ==> D:\MATLAB6p5\toolbox\matlab\funfun\quad.m
On line 67 ==> if ~isfinite(y(7))
隱藏的圖形對象屬性
Matlab的所謂句柄圖形(handle
graphics)對象的配置是通過許多屬性的設置來完成的。有一些幫助文件中沒有提到的確實存在的屬性。
figure的Toolbar屬性
有三個值:'none', 'auto', 'figure'
利用這個屬性可以把figure變成沒有菜單條卻有工具欄的樣式:
figure('Menubar', 'none', 'Toolbar', 'figure')
root object的Default屬性
在我的Malab環境里,Root object有如下的默認值:
get(0, 'Default')
ans =
defaultFigurePosition: [232 258 560 420]
defaultTextColor: [0 0 0]
defaultAxesXColor: [0 0 0]
defaultAxesYColor: [0 0 0]
defaultAxesZColor: [0 0 0]
defaultPatchFaceColor: [0 0 0]
defaultPatchEdgeColor: [0 0 0]
defaultLineColor: [0 0 0]
defaultFigureInvertHardcopy: 'on'
defaultFigureColor: [0.8000 0.8000
0.8000]
defaultAxesColor: [1 1 1]
defaultAxesColorOrder: [7x3 double]
defaultFigureColormap: [64x3 double]
defaultSurfaceEdgeColor: [0 0 0]
defaultFigurePaperType: 'A4'
defaultFigurePaperUnits: 'centimeters'
實際上,還有一些默認值不會被顯示出來:
get(0, 'defaultUicontrolBackgroundColor')
get(0, 'defaultUicontrolForegroundColor')
get(0, 'defaultUicontrolFontName')
get(0, 'defaultUicontrolFontSize')
get(0, 'defaultUicontrolFontWeight')
get(0, 'defaultUicontrolFontAngle')
ans =
0.7725 0.7961 0.8118
ans =
0 0 0
ans =
MS Sans Serif
ans =
8
ans =
normal
ans =
normal
這些默認值有助于在創建用戶界面時遵循操作系統顏色,例如:
figure('Color', get(0,'defaultUicontrolBackgroundColor'))
system_dependent('getdata')
system_dependent('getwinsys')
版本
使用version函數可以獲得Matlab或工具箱的版本:
v1 = ver('matlab')
v1 =
Name: 'MATLAB'
Version: '6.5'
Release: '(R13)'
Date: '20-Jun-2002'
v2 = ver('control')
v2 =
Name: 'Control System Toolbox'
Version: '5.2'
Release: '(R13)'
Date: '28-Jun-2002'
如果工具箱不存在或沒有安裝返回空結構
v3 = ver('nonsense')
v3 =
0x0 struct array with fields:
Name
Version
Release
Date
可以利用這個函數讓自己的程序在不當的Matlab版本上運行時給出比較體面的警告。另外,有一個幫助中沒有提及的內部函數system_dependent可以獲得操作系統的版本:
system_dependent('getos')
ans =
Microsoft Windows XP
system_dependent('getwinsys')
ans =
Version 5.1 (Build 2600)
uitools工具集
除了幫助中提及的一些GUI工具函數外,matlabroot\toolbox\matlab\uitools里還有不少幫助里沒有提及的函數,建議仔細研究一下(help
uitools),例如,makemenu函數可以從字符串中生成菜單:
labels = str2mat( ...
'&File', ...
'>&New^n', ...
'>&Open', ...
'>>Open &document^d', ...
'>>Open &graph^g', ...
'>-------', ...
'>&Save^s', ...
'&Edit', ...
'&View', ...
'>&Axis^a', ...
'>&Selection region^r' ...
);
calls = str2mat( ...
'', ...
'disp(''New'')', ...
'', ...
'disp(''Open doc'')', ...
'disp(''Open graph'')', ...
'', ...
'disp(''Save'')', ...
'', ...
'', ...
'disp(''View axis'')', ...
'disp(''View selection region'')' ...
);
handles = makemenu( figure('Menubar', 'none'), labels,
calls);
總結
以上是生活随笔為你收集整理的matlab错误原因,matlab常见错误分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: usd php 换算,货币在PHP中从I
- 下一篇: matlab 一维 平滑,一维加噪信号的