Matlab 角落案例,意外和不寻常
多年来,在阅读其他代码时,我遇到并收集了一些MATLAB语法的示例,这些示例起初可能不同寻常,而且违反直觉。请随时评论或补充此列表。我用r2006a进行了验证Matlab 角落案例,意外和不寻常,matlab,Matlab,多年来,在阅读其他代码时,我遇到并收集了一些MATLAB语法的示例,这些示例起初可能不同寻常,而且违反直觉。请随时评论或补充此列表。我用r2006a进行了验证 MATLAB总是将函数的第一个输出参数(如果它至少有一个)返回到调用方工作区,如果调用函数时没有返回参数,如myFunc1(),也会意外返回;myFunc2()调用方工作区仍将包含myFunc2()的第一个输出作为“不可见”ans变量。如果ans是一个参考对象,它可能会起到重要作用-它将保持活动状态 MATLAB有时很宽容。在这种情况
MATLAB总是将函数的第一个输出参数(如果它至少有一个)返回到调用方工作区,如果调用函数时没有返回参数,如
myFunc1(),也会意外返回;myFunc2()
调用方工作区仍将包含myFunc2()的第一个输出代码>作为“不可见”ans
变量。如果ans
是一个参考对象,它可能会起到重要作用-它将保持活动状态
MATLAB有时很宽容。在这种情况下,将属性设置为对象数组也适用于无意义属性,至少当数组为空时是这样。这种数组通常来自harray=findobj(0,'Tag','NotExistingTag')
使用end
关键字可能看起来不干净,但有时非常方便,而不是使用length(myArray)
令人惊讶的是any([])
返回false
和all([])
返回true
。我一直认为all
比any
更强
编辑:
对于any()
返回true
值子集的非空参数all()
返回true
(例如真值表)。这意味着any()
false
意味着all()
false
。MATLAB以[]
作为参数违反了这个简单规则
罗兰也是
过程式COM对象方法分派。不要奇怪exist('Select')
返回零
在这种情况下,MATLAB将字符串变量myString
隐式转换为单元格类型{myString}
。如果我不希望它这样做,它也会起作用
另一个演员的例子。每个人都可能期望uint8
值被转换为double
,但Mathworks有另一种观点。在没有警告的情况下,这种行为是非常危险的
这看起来很傻,但你可以用圆括号调用变量。实际上,这是有意义的,因为这样您就可以在给定句柄的情况下执行函数
语法Foo(:)
不仅适用于数据,而且在被称为Bar.Foo(:)
时也适用于函数,在这种情况下,函数输入参数作为字符冒号':'
传递
例如,让Bar.Foo=@(x)disp(x)
现在调用Bar.Foo(:)
在MATLAB命令窗口中打印char':'
这个奇怪的特性适用于所有Matlab7版本,没有警告
令人惊讶的是,这段代码既不返回向量也不产生错误,只使用代码布局定义矩阵。它可能是古代的遗物
编辑:非常方便的功能,请参见gnovice的评论
这段代码完成了您可能期望它完成的任务。该函数set
接受一个结构,因为它的第二个参数是已知的事实并且是有意义的,而这个sintax仅仅是一个cell2struct
起初,等价规则有时出乎意料。例如,'A'==65
返回true(尽管对于C专家来说这是不言而喻的)。类似地,isequal([],{})
retuns,正如预期的那样,false
和isequal([],'')
返回true
字符串数值等效意味着所有字符串函数也可用于数值数组,例如,用于查找大型数组中子数组的索引:
ind = strfind( [1 2 3 4 1 2 3 4 1 2 3 4 ], [2 3] )
MATLAB函数isnumeric()
返回布尔值的false
。这感觉只是。。。错误:-)
您还知道哪些意外/不寻常的MATLAB功能?阵列与单元
让我们先看一些基本语法。要创建包含元素a、b、c的数组,请编写[abc]
。要创建包含数组a、B、C的单元格,可以编写{abc}
。到目前为止还不错
访问数组元素的方式如下:arr(i)
。对于单元格,它是cell{i}
。还不错
现在,让我们尝试删除一个元素。对于阵列:arr(i)=[]
。从上面的示例推断,您可以尝试对单元格使用cell{i}={}
,但这是一个语法错误。事实上,删除单元格元素的正确语法与数组使用的语法完全相同:cell(i)=[]
因此,大多数情况下,您使用特殊语法访问单元格,但在删除项时,您使用数组语法
如果你深入研究,你会发现实际上一个单元格是一个数组,其中每个值都是特定类型的。因此,您仍然可以编写单元格(i)
,您只需返回{A}
(一个单值单元格!)cell{i}
是直接检索a
的缩写
所有这些在我看来都不是很好。我将不列出奇怪的MATLAB语法示例,而是讨论问题中我认为有意义或预期/记录/期望的行为的一些示例
- 如何处理空参数:
any([])
的结果很有意义:输入向量中没有非零元素(因为它是空的),因此返回false
通过思考如何实现此函数的自己版本,可以更好地理解all([])
的结果:
function allAreTrue = my_all(inArray)
allAreTrue = true;
N = numel(inArray);
index = 1;
while allAreTrue && (index <= N)
allAreTrue = (inArray(index) ~= 0);
index = index + 1;
end
end
你为什么想让MATLAB这样做?我注意到的一个原因是,它可以轻松地将数据从Excel文档剪切并粘贴到MATLAB命令窗口中的变量中。请尝试以下操作:
- 在Excel文件中选择一个区域并复制它。
any([]) ~= all([])
Select(Range(ExcelComObj))
[myString, myCell]
[double(1.8), uint8(123)] => 2 123
a = 5;
b = a();
a = {'aa', 'bb'
'cc', 'dd'};
set(hobj, {'BackgroundColor','ForegroundColor'},{'red','blue'})
ind = strfind( [1 2 3 4 1 2 3 4 1 2 3 4 ], [2 3] )
function allAreTrue = my_all(inArray)
allAreTrue = true;
N = numel(inArray);
index = 1;
while allAreTrue && (index <= N)
allAreTrue = (inArray(index) ~= 0);
index = index + 1;
end
end
a = {'aa', 'bb'
'cc', 'dd'};
a = {'aa', 'bb'; ...
'cc', 'dd'};
a = {'aa', 'bb'; 'cc', 'dd'};
%# create an image with one white pixel
img = zeros(100);
img(25,65) = 1;
%# show the image
figure
imshow(img);
%# now circle the pixel. To be sure of the coordinate, let's run find
[x,y] = find(img);
hold on
%# plot a red circle...
plot(x,y,'or')
%# ... and it's not in the right place
%# plot a green circle with x,y switched, and it works
plot(y,x,'og')
m = magic(3);
m(1:2,1:3) = zeros(3,2);
??? Subscripted assignment dimension mismatch.
m(1:2,1:2) = 1; %# scalar to vector
m(2,:) = ones(3,1); %# vector n-by-1 to vector 1-by-n (for newer Matlab versions)
m(:) = 1:9; %# vector to 'linearized array'
>> m = magic(4); %# a 4-by-4 array
>> id = logical([1 1 0 1 0])
id =
1 1 0 1 0
>> m(id,:) %# id has five elements, m only four rows
ans =
16 2 3 13
5 11 10 8
4 14 15 1
%# this wouldn't work if the last element of id was 1, btw
>> id = logical([1 1 0])
id =
1 1 0
>> m(id,:) %# id has three elements, m has four rows
ans =
16 2 3 13
5 11 10 8