发现如果一个矩阵的所有元素是有限的,快!
都是矩阵元素有限?做旧的方式。
你怎么检查是否一个矩阵的所有元素是有限的吗?这是一个矩阵,答案是“不”的设计。
=兰德(3),(2,2)=正无穷
如果测试的常见模式
每一个
一个矩阵元素是有限的首次应用
isfinite
函数返回一个逻辑数组:
checkFinite = isfinite (a)
然后通过
所有
函数检查是否每一列的所有条目
真正的
或不
checkAllRowsFinite =所有(checkFinite)
我们应用
所有
函数一更多时间来得到我们想要的结果
checkAllFinite =所有(checkAllRowsFinite)
不!所有的原始矩阵的条目不是有限!通常,所有上述投入一行:
所有(所有checkAllFinite = (isfinite (a)))
这是一个常见的模式多年,事情可能失控时处理多个维数组。例如检查每一个元素
兰德(= 3,3,3,3);
是有限的,我们需要做什么
checkAllFinite = ((((isfinite (a)))))
这是一个很多
所有
!有些人使用简洁但可以说是神秘的
checkAllFinite =所有(isfinite ((:)))
R2018b,我们这样做的方法引入了一个新的更好的阅读
checkAllFinite =所有(isfinite (a),“所有”)
新在R2022a: allfinite -发现如果是有限的,很快
我们看到这些模式在我们的代码和用户的代码。以至于在R2022a,我们开发了另一个函数,使它更容易执行这个常见的操作:
allfinite
=兰德(3),(2,2)=正;
CheckAllFinite = allfinite (a)
我们没有这样做只是为了节省打字。我们做它,因为它是快!你看到大量小矩阵的最大区别。让我们看看1000万3 x 3矩阵。
a3 =兰德(3);
抽搐
为i = 1:1e7
tf =所有(isfinite (a3),“所有”);
结束
oldMethodTime = toc
oldMethodTime = 0.7560
抽搐
为i = 1:1e7
tf = allfinite (a3);
结束
newMethodTime = toc
newMethodTime = 0.0847
流(“allfinite (a3) %。2f times faster than all(isfinite(a3), 'all') for "+…
“1000万小矩阵\ n”oldMethodTime / newMethodTime)
可以加起来是相当不同的函数被称为很多。更大的好处是减少了矩阵但还是有用的
a2000 =兰德(2000);
抽搐
为i = 1:1e3
tf =所有(isfinite (a2000),“所有”);
结束
oldMethodTime = toc
oldMethodTime = 2.9144
抽搐
为i = 1:1e3
tf = allfinite (a2000);
结束
newMethodTime = toc
newMethodTime = 0.8977
流(“allfinite (a2000) %。2f times faster than all(isfinite(a2000), 'all') for "+…
“1000大矩阵\ n”oldMethodTime / newMethodTime)
有没有nan或者遗漏什么吗?
随着
allfinite
,MATLAB数学团队确定了两个其他模式,可以以类似的方式,提出了优化功能
anynan
和
anymissing
。
使用数组时,几乎总是会有一个加速尽管你可能需要多次运行它看到它。
B = 0。/ (2 1 0 1 2)
抽搐
重复= 1 e6;
为我= 1:重复
tf =任何(isnan (B),“所有”);
结束
oldMethodTime = toc
oldMethodTime = 0.0887
抽搐
为我= 1:重复
tf = anynan (B);
结束
newMethodTime = toc
newMethodTime = 0.0126
流(“anynan (B) %。2f times faster than any(isnan(B), 'all') for "+…
“% d小矢量\ n”oldMethodTime / newMethodTime重复)
所有数据类型anynan更快吗?
对于一些数据类型,您可能不会看到一个加速,但,在最坏的情况下,现有的方法。考虑一下这个例子对检查表中缺失值
singleVar =单([1,3,5,7,9,11,13]);
cellstrVar = {“一个”;“三”;”;“七”;“九”;“十一”;“13”};
categoryVar =分类({“红色”;“黄色”;“蓝”;“紫色”;”;“紫外线”;“橙”});
dateVar = [datetime(2015年,1:7,15)]';
stringVar = [“一个”;“b”;“c”;“d”;“e”;“f”;“g”];
mytable =表(singleVar cellstrVar、categoryVar dateVar, stringVar)
以前,你可能会检查这个如下
TF =任何(ismissing (mytable),“所有”)
现在,我们能做的
TF = anymissing (mytable)
相同的时间我们可以安全地使用这些新功能。让我们运行它的5000倍
抽搐
重复= 5 e3;
为我= 1:重复
tf =任何(ismissing (mytable),“所有”);
结束
oldMethodTime = toc
oldMethodTime = 0.4411
抽搐
为我= 1:重复
tf = anymissing (mytable);
结束
newMethodTime = toc
newMethodTime = 0.3786
更新MathWorks代码来使用这些新功能
我们马上开始使用这些新功能在许多MATLAB函数。他们像expm用于参数验证功能,logm和中位数。看看自己通过查看源代码,例如
编辑sqrtm
交给你了
释放和R2022a一样大,有许多闪闪发光的特性,这些简单的功能往往被忽视。然而,他们是有用的执行非常常见的操作的新方法。团队MathWorks已经开始使用它们的所有代码库进行改进,我相信我会有机会很快就有效地使用在用户的代码。
你认为他们会是有用的在你的工作流程吗?你有任何类似的功能希望MATLAB有吗?
- 类别:
- MATLAB编程语言,
- 新功能,
- 性能
评论
要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。