Matlab 角落案例,意外和不寻常

Matlab 角落案例,意外和不寻常,matlab,Matlab,多年来,在阅读其他代码时,我遇到并收集了一些MATLAB语法的示例,这些示例起初可能不同寻常,而且违反直觉。请随时评论或补充此列表。我用r2006a进行了验证 MATLAB总是将函数的第一个输出参数(如果它至少有一个)返回到调用方工作区,如果调用函数时没有返回参数,如myFunc1(),也会意外返回;myFunc2()调用方工作区仍将包含myFunc2()的第一个输出作为“不可见”ans变量。如果ans是一个参考对象,它可能会起到重要作用-它将保持活动状态 MATLAB有时很宽容。在这种情况

多年来,在阅读其他代码时,我遇到并收集了一些MATLAB语法的示例,这些示例起初可能不同寻常,而且违反直觉。请随时评论或补充此列表。我用r2006a进行了验证


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