Mik*_*ail 8 matlab vectorization
这篇文章是通过讨论单元数组是否为"正常数组"并且向量化不适用于单元数组来触发的.
我想知道为什么在MATLAB中没有实现后面的矢量化语法,它反对它:
>> {'hallo','matlab','world'} == 'matlab'
??? Undefined function or method 'eq' for input arguments of type 'cell'.
Run Code Online (Sandbox Code Playgroud)
在内部它将等同于
[{'hallo'},{'matlab'},{'world'}] == {'matlab'}
Run Code Online (Sandbox Code Playgroud)
因为MATLAB知道何时投射,以下工作:
[{'hallo','matlab'},'world']
Run Code Online (Sandbox Code Playgroud)
Cell数组是一个指针数组.如果左侧和右侧都指向相同的对象,isequal('hallo','hallo')则按预期返回true,那么为什么MATLAB仍然不允许最顶层的示例?
我知道我可以使用strmatch或cellfun.
摘要:
==这是需要向量化在上面的例子中是eq与不isequal(其它运营商<是lt等)eq 内置数值类型,适用于所有其他类型(如字符串)MATLAB提供了重载此(和其他)运算符的自由.myFun( myString )或的函数矢量化myFun( myCellOfStrings )也是可能的,你只需在内部实现它myFun.功能sin(val)和sin(array)工作也不是巫术,而是因为这两种情况都是在内部实施的.首先,==是不一样的isequal.使用时调用的函数==是eq,并且每个函数的范围都不同.
对于例如in eq(A,B),if B是标量,函数检查每个元素A是否相等B并返回逻辑向量.
eq([2,5,4,2],2)
ans =
1 0 0 1
Run Code Online (Sandbox Code Playgroud)
但是,isequal(A,B)如果检查A是相同等于B在各个方面.换句话说,MATLAB无法区分A和B.为上面的例子执行此操作:
isequal([2,5,4,2],2)
ans =
0
Run Code Online (Sandbox Code Playgroud)
我认为你在问题中真正打算提出的问题是,但事实并非如此:
"为什么
==没有为细胞阵列定义?"
嗯,一个简单的原因是:细胞不适合这种用途.当您开始考虑个别情况时,您可以很容易地看到如何为单元格实现这样的函数很快变得复杂.例如,考虑一下
{2,5,{4,2}}==2
Run Code Online (Sandbox Code Playgroud)
你期望答案是什么?一个合理的猜测是
ans = {1,0,0}
Run Code Online (Sandbox Code Playgroud)
这是公平的.但是,让我们说,我不同意.现在,我希望平等操作走下嵌套单元格并返回
ans = {1,0,{0,1}}
Run Code Online (Sandbox Code Playgroud)
你能不同意这种解释吗?也许不是.它同样有效,在某些情况下,这是你想要的行为.
这只是一个简单的例子.现在在单元格中添加嵌套单元格,不同类型等的混合,并考虑处理每个角落情况.对于开发人员来说,实现这样一种可以被每个人都满意地使用的功能很快成为一场噩梦.
因此,解决方案是重载功能,仅实现您希望的特定功能,以便在您的应用程序中使用.MATLAB提供了一种方法,通过创建@cell目录并eq.m按照您希望的方式定义单元格来使用.Ramashalanka在他的回答中证明了这一点.
有许多事情对于 MATLAB 来说似乎很自然,但他们却选择不这样做。也许他们不想考虑许多特殊情况(见下文)。您可以通过重载自己完成。如果您创建一个目录@cell并将以下内容放入新函数中eq.m:
function c = eq(a,b)
if iscell(b) && ~iscell(a)
c = eq(b,a);
else
c = cell(size(a));
for n = 1:numel(c)
if iscell(a) && iscell(b)
c{n} = isequal(a{n},b{n});
else
c{n} = isequal(a{n},b);
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做,例如:
>> {'hallo','matlab','world'} == 'matlab'
ans = [0] [1] [0]
>> {'hallo','matlab','world'} == {'a','matlab','b'}
ans = [0] [1] [0]
>> {'hallo','matlab','world'} == {'a','dd','matlab'}
ans = [0] [0] [0]
>> { 1, 2, 3 } == 2
ans = [0] [1] [0]
Run Code Online (Sandbox Code Playgroud)
但是,即使我在简单的函数中考虑了几种情况,但有很多事情我没有考虑(检查单元格是否相同大小,检查多元素单元格与单例单元格等)。
我使用了isequal即使它是用eq(ie ==) 调用的,因为它处理得{'hallo','matlab','world'} == 'matlab'更好,但实际上我应该考虑更多的情况。
(编辑:我使函数稍微短一些,但效率较低)