MATLAB 总是将函数的第一个输出参数(如果至少有一个)返回到其调用者工作区,即使在没有返回参数的情况下调用函数,例如
myFunc1(); myFunc2();
,调用者工作区仍将包含 myFunc2();
的第一个输出参数作为“不可见”的 ans
变量。如果 ans
是引用对象,则它可能会发挥重要作用 - 它将保持活动状态。set([], 'Background:Color','red')
MATLAB有时候非常宽容。在这种情况下,将属性设置为对象数组时,即使属性是无意义的,至少当数组为空时也可以工作。这样的数组通常来自harray = findobj(0,'Tag','NotExistingTag')
。
myArray([1,round(end/2)])
在IT技术中,有时使用end
关键字可能会看起来不够规范,但有时它比使用length(myArray)
更方便。
any([]) ~= all([])
令人惊讶的是,
any([])
返回false
,all([])
返回true
。我一直认为all
比any
更强。编辑:对于非空参数,
all()
对于any()
返回true
的一部分值(例如真值表)也返回true
。这意味着any()
false
意味着all()
false
。MATLAB在使用[]
作为参数时违反了这个简单的规则。Loren也在博客中提到了这个问题。Select(Range(ExcelComObj))
程序化风格的COM对象方法分派。不要惊讶
exist('Select')
返回零![myString, myCell]
MATLAB在这种情况下会将字符串变量
myString
隐式转换为单元格类型{myString}
。这样做是有效的,即使我没有预料到它会这样做。[double(1.8), uint8(123)] => 2 123
另一个强制类型转换的例子。每个人都可能期望将uint8
值强制转换为double
,但是Mathworks有另一种观点。没有警告,这种行为非常危险。
a = 5;
b = a();
虽然看起来有些傻,但你可以使用圆括号调用一个变量。实际上这很有意义,因为通过这种方式你可以执行一个函数并给出其 handle。
语法
Foo(:)
不仅适用于数据,而且对于函数也是如此,如果作为Bar.Foo(:)
调用,此时函数的输入参数将被传递为字符冒号':'
。例如,令
Bar.Foo = @(x) disp(x)
,现在调用Bar.Foo(:)
会在MATLAB命令行窗口中打印字符':'
。这个奇怪的功能在所有的MATLAB 7版本中都可以工作而没有警告。
a = {'aa', 'bb'
'cc', 'dd'};
令人惊讶的是,这段代码既没有返回向量也没有引发错误,而是仅仅使用代码布局定义了一个矩阵。这可能是古代遗留下来的。
编辑:非常方便的功能,请参见gnovice的评论。
set(hobj, {'BackgroundColor','ForegroundColor'},{'red','blue'})
这段代码的作用与您预期的相同。函数
set
接受结构作为其第二个参数是一个已知的事实,并且这种语法只需要使用cell2struct
函数即可实现。
等价规则有时会令人意外。例如,
'A'==65
返回true(虽然对于C语言方面的专家来说这是显而易见的)。类似地,isequal([],{})
返回如预期的false
,isequal([],'')
返回true
。字符串-数字等价性意味着所有字符串函数也可以用于数值数组,例如在大数组中查找子数组的索引。
ind = strfind( [1 2 3 4 1 2 3 4 1 2 3 4 ], [2 3] )
MATLAB函数isnumeric()
对于布尔值返回false
。这感觉就像……假的 :-)
您知道哪些其他意外/不寻常的MATLAB功能?
all([])
为真,any([])
为假,原因与prod([])
为1和sum ([])
为0相同:它们是结合律的产物。如果一个操作f是结合律的,那么对于任何A、B、C,使得A = [BC],不变条件f(A)= f([f(B) f(C)]) 必须成立。(例如,如果“sum”要成为可结合运算,则列表的总和必须等于列表的“第一项”与“剩余列表的总和”的总和)。这包括B = A且C = []的情况,因此此不变条件强制定义... - kjo