我认为每个人都会同意,MATLAB语言并不美观,也不特别一致。但没关系!我们仍然必须使用它来完成任务。
您有哪些使事情变得更容易的技巧?让我们每个回答提供一个技巧,以便人们可以投票支持他们。此外,请尝试用示例说明您的答案。
这里有一些不太明显但在使用时会非常有用的函数:
mfilename
(返回当前正在运行的MATLAB脚本的名称)dbstack
(提供对MATLAB函数堆栈中名称和行号的访问权限)keyboard
(停止执行并将控制权移交给调试提示符;这就是为什么调试提示符中有一个K的原因K>>
)dbstop error
(自动将您置于调试模式,并停在触发错误的行处)从Matlab中调用Java代码
我喜欢使用函数句柄,有很多理由。首先,在MATLAB中,它们是我找到的最接近指针的东西,因此您可以为对象创建类似引用的行为。还有一些不错(而且更简单)的事情可以用它们做。例如,替换switch语句:
switch number,
case 1,
outargs = fcn1(inargs);
case 2,
outargs = fcn2(inargs);
...
end
%
%can be turned into
%
fcnArray = {@fcn1, @fcn2, ...};
outargs = fcnArray{number}(inargs);
我只是认为这样的小事很酷。
使用nargin来为可选参数设置默认值,使用nargout来设置可选的输出参数。快速示例。
function hLine=myplot(x,y,plotColor,markerType)
% set defaults for optional paramters
if nargin<4, markerType='none'; end
if nargin<3, plotColor='k'; end
hL = plot(x,y,'linetype','-', ...
'color',plotColor, ...
'marker',markerType, ...
'markerFaceColor',plotColor,'markerEdgeColor',plotColor);
% return handle of plot object if required
if nargout>0, hLine = hL; end
使用cellfun和arrayfun进行自动化的for循环。
nargin
,就像这样:function result = multiply(a, b)
if nargin == 0 %no inputs provided, run using defaults for a and b
clc;
disp('RUNNING IN TEST MODE')
a = 1;
b = 2;
end
result = a*b;
在使用聚合函数(如min、max、mean、diff、sum、any、all等)时,请严格指定维度。
例如,以下行:
reldiff = diff(a) ./ a(1:end-1)
在计算向量中元素的相对差异时,可能会很有效,但是如果向量退化为仅包含一个元素,则计算会失败:
>> a=rand(1,7);
>> diff(a) ./ a(1:end-1)
ans =
-0.5822 -0.9935 224.2015 0.2708 -0.3328 0.0458
>> a=1;
>> diff(a) ./ a(1:end-1)
??? Error using ==> rdivide
Matrix dimensions must agree.
>> diff(a, [], 2) ./ a(1, 1:end-1)
ans =
Empty matrix: 1-by-0
>>
a(1:end)
而不是a(1:end-1)
。 - Tobias Kienzlerdiff
应用于一个大小为 n 的向量的结果是大小为 n-1。 - ymiheret = (0:0.005:10)';
x = sin(2*pi*t);
x(x>0.5 & t<5) = 0.5;
% This limits all values of x to a maximum of 0.5, where t<5
plot(t,x);
冒号运算符用于操作数组。
@ScottieT812提到了其中一种用途:将数组扁平化,但还有其他选择数组的变体:
x=rand(10,10);
flattened=x(:);
Acolumn=x(:,10);
Arow=x(10,:);
y=rand(100);
firstSix=y(1:6);
lastSix=y(end-5:end);
alternate=y(1:2:end);
if exist('plotColor', 'var') ...
,我发现函数更易于维护,因为这样你使用的是参数的名称而不仅仅是参数编号。 - rescdsk