MATLAB的博客

实用的建议在前沿的人

发现如果一个矩阵的所有元素是有限的,快!

今天,我要专注于三个新功能添加到R2022a MATLAB编程语言: allfinite , anynan anymissing 。这些函数更简洁,通常更快,比替代方法
都是矩阵元素有限?做旧的方式。
你怎么检查是否一个矩阵的所有元素是有限的吗?这是一个矩阵,答案是“不”的设计。
=兰德(3),(2,2)=正无穷
一个= 3×3
正0.7485 0.8283 0.2797 0.0722 0.6945 0.8625 0.0988 0.5190
如果测试的常见模式 每一个 一个矩阵元素是有限的首次应用 isfinite 函数返回一个逻辑数组:
checkFinite = isfinite (a)
checkFinite = 3×3逻辑数组
1 1 1 1 0 1 1 1 1
然后通过 所有 函数检查是否每一列的所有条目 真正的 或不
checkAllRowsFinite =所有(checkFinite)
checkAllRowsFinite = 1×3逻辑数组
1 0 1
我们应用 所有 函数一更多时间来得到我们想要的结果
checkAllFinite =所有(checkAllRowsFinite)
checkAllFinite =逻辑
0
不!所有的原始矩阵的条目不是有限!通常,所有上述投入一行:
所有(所有checkAllFinite = (isfinite (a)))
checkAllFinite =逻辑
0
这是一个常见的模式多年,事情可能失控时处理多个维数组。例如检查每一个元素
兰德(= 3,3,3,3);
是有限的,我们需要做什么
checkAllFinite = ((((isfinite (a)))))
checkAllFinite =逻辑
1
这是一个很多 所有 !有些人使用简洁但可以说是神秘的
checkAllFinite =所有(isfinite ((:)))
checkAllFinite =逻辑
1
R2018b,我们这样做的方法引入了一个新的更好的阅读
checkAllFinite =所有(isfinite (a),“所有”)
checkAllFinite =逻辑
1
新在R2022a: allfinite -发现如果是有限的,很快
我们看到这些模式在我们的代码和用户的代码。以至于在R2022a,我们开发了另一个函数,使它更容易执行这个常见的操作: allfinite
=兰德(3),(2,2)=正;
CheckAllFinite = allfinite (a)
CheckAllFinite =逻辑
0
我们没有这样做只是为了节省打字。我们做它,因为它是快!你看到大量小矩阵的最大区别。让我们看看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)
allfinite (a3)是8.93倍(isfinite (a3),“所有”)为1000万个小矩阵
可以加起来是相当不同的函数被称为很多。更大的好处是减少了矩阵但还是有用的
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)
allfinite (a2000)是3.25倍(isfinite (a2000),“所有”)对1000家大型矩阵
有没有nan或者遗漏什么吗?
随着 allfinite ,MATLAB数学团队确定了两个其他模式,可以以类似的方式,提出了优化功能 anynan anymissing 使用数组时,几乎总是会有一个加速尽管你可能需要多次运行它看到它。
B = 0。/ (2 1 0 1 2)
B = 1×5
0 0南0 0
抽搐
重复= 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 (B)是7.03倍的速度比任何(isnan (B),“所有”)为1000000小向量
所有数据类型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)
mytable = 7×5表
singleVar cellstrVar categoryVar dateVar stringVar
1 1 “一个” 红色的 15 - 1月- 2015 “一个”
2 3 “三” 黄色的 2015年- 2月15日 “b”
3 5 蓝色的 15 - 3月- 2015 “c”
4 7 “七” 紫罗兰色的 15 - 4月- 2015 “d”
5 9 “九” <定义> 15 - 5 - 2015 “e”
6 11 “十一” 紫外线 2015年- 6月15日 “f”
7 13 “13” 橙色 15 - 7 - 2015 “g”
以前,你可能会检查这个如下
TF =任何(ismissing (mytable),“所有”)
TF =逻辑
1
现在,我们能做的
TF = anymissing (mytable)
TF =逻辑
1
相同的时间我们可以安全地使用这些新功能。让我们运行它的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有吗?
|

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。