你最喜欢的MATLAB/Octave编程技巧是什么?

73

我认为每个人都会同意,MATLAB语言并不美观,也不特别一致。但没关系!我们仍然必须使用它来完成任务。

您有哪些使事情变得更容易的技巧?让我们每个回答提供一个技巧,以便人们可以投票支持他们。此外,请尝试用示例说明您的答案。

31个回答

11

这里有一些不太明显但在使用时会非常有用的函数:

  • mfilename(返回当前正在运行的MATLAB脚本的名称)
  • dbstack(提供对MATLAB函数堆栈中名称和行号的访问权限)
  • keyboard(停止执行并将控制权移交给调试提示符;这就是为什么调试提示符中有一个K的原因K>>
  • dbstop error(自动将您置于调试模式,并停在触发错误的行处)

10

从Matlab中调用Java代码


10

我喜欢使用函数句柄,有很多理由。首先,在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);

我只是认为这样的小事很酷。


10

使用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

8
如果使用 if exist('plotColor', 'var') ...,我发现函数更易于维护,因为这样你使用的是参数的名称而不仅仅是参数编号。 - rescdsk

5

使用cellfun和arrayfun进行自动化的for循环。


5
为了能够快速测试一个函数,我使用 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;

稍后,我会添加一个单元测试脚本来测试不同输入条件下的函数。

5

在使用聚合函数(如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.

如果您的函数指定了正确的尺寸,那么这行代码将返回一个空的 1 行 0 列的矩阵,这是正确的:
>> diff(a, [], 2) ./ a(1, 1:end-1)

ans =

   Empty matrix: 1-by-0

>> 

同样适用于min-function,它通常在矩阵列上计算最小值,直到矩阵只有一行。 - 然后它将返回该行的最小值,除非维度参数另有规定,否则可能会破坏您的应用程序。
我几乎可以保证,因此设置这些聚合函数的尺寸将在以后节省相当多的调试工作。
至少对于我来说是这样的。 :)

这个失败是因为Matlab不是C/C++:你应该使用a(1:end)而不是a(1:end-1) - Tobias Kienzler
1
这个不会失败:将 diff 应用于一个大小为 n 的向量的结果是大小为 n-1。 - ymihere

5

了解您的轴属性!有许多可以设置的属性,以调整默认绘图属性以达到您想要的效果:

set(gca,'fontsize',8,'linestyleorder','-','linewidth',0.3,'xtick',1:2:9);

(例如,将字体大小设置为8pt,将所有新行的线型设置为实线,并将它们的宽度设置为0.3pt,将xtick点设置为[1, 3, 5, 7, 9])
线(Line)和图表(Figure)属性也很有用,但我发现自己最常使用的是坐标轴(Axis)属性。请参考:LineFigure 属性。

5
在赋值语句的左侧使用条件参数:
t = (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);

5

冒号运算符用于操作数组。

@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);

1
lastSix = y(end-5:end); 你的版本返回了7个元素。 - Jonas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接