MATLAB博客

给处于领先地位的人的实用建议

找出一个矩阵的所有元素是否都是有限的,快!

今天,我将重点介绍R2022a中加入到MATLAB编程语言中的三个新函数: allfinite anynan 而且 anymissing .这些函数比其他方法更简洁,通常也更快
所有矩阵元素都是有限的吗?用老方法。
你如何检查一个矩阵的所有元素是否都是有限的?这是一个矩阵,答案是“不”。
=兰德(3),(2,2)=正无穷
一个= 3×3
0.6945 0.8625 0.0988 0.0722 Inf 0.7485 0.8283 0.2797 0.5190
用于测试if的通用模式 每一个 矩阵中的元素是有限的,首先应用 isfinite 函数,返回一个逻辑数组:
checkFinite = isfinite(a)
checkFinite = 3×3逻辑阵列
1 1 1 1 1 0 1 1 1 1 1
然后把这个传递给 所有 函数,该函数检查每列的所有项是否为 真正的 或不
checkAllRowsFinite = all(checkFinite)
checkAllRowsFinite = 1×3逻辑阵列
10 0 1
我们应用 所有 再执行一次函数以得到我们想要的结果
checkAllFinite = all(checkAllRowsFinite)
checkAllFinite =逻辑
0
不!原始矩阵的所有元素都不是有限的!通常,以上所有内容都放在一行中:
checkAllFinite = all(所有(isfinite(a)))
checkAllFinite =逻辑
0
这是多年来常见的模式,当处理多维数组时,事情可能会失控。例如,检查是否的每个元素
兰德(= 3,3,3,3);
是有限的,我们需要做什么
checkAllFinite = all(all(all(all(isfinite(a)))))
checkAllFinite =逻辑
1
那是很多 所有 !有些人使用简洁但可以说是神秘的
checkAllFinite = all(isfinite(a(:))))
checkAllFinite =逻辑
1
所以,在R2018b中,我们引入了一种更好读的新方法
checkAllFinite = all(isfinite(a)),“所有”
checkAllFinite =逻辑
1
R2022a新增:allfinite -查找是否all是有限的,快速
我们在自己的代码和用户的代码中经常看到这些模式。以至于在R2022a中,我们开发了另一个函数来更容易地执行这个常见的操作: allfinite
A (2,2)=inf;
CheckAllFinite = allfinite(a)
CheckAllFinite =逻辑
0
我们这样做并不仅仅是为了节省输入。我们这么做是因为这样更快!你可以看到大量小矩阵的最大区别。让我们看看1000万个3 × 3矩阵。
A3 = rand(3);
抽搐
i = 1:1e7
Tf = all(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)
对于1000万个小矩阵,Allfinite (a3)比all(isfinite(a3), 'all')快8.93倍
这就导致了函数调用次数的巨大差异。对于较大的矩阵,这种好处会减少,但它仍然有用
A2000 = rand(2000);
抽搐
i = 1:1e3
Tf = all(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)
对于1000个大矩阵,Allfinite (a2000)比all(isfinite(a2000), 'all')快3.25倍
有nan吗,还是少了什么?
随着 allfinite , MATLAB数学团队确定了另外两种可以以类似方式优化的模式,并提出了函数 anynan 而且 anymissing 在使用数组时,几乎总是会有一个加速,尽管您可能需要运行多次才能看到它。
B = 0。/[-2 -1 0 1 2]
B = 1×5
0 0 NaN 0 0
抽搐
repeat = 1e6;
我= 1:重复
tf = any(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小向量\noldMethodTime / newMethodTime重复)
对于1000000个小向量,anynan(B)比any(isnan(B), 'all')快7.03倍
是否所有数据类型都更快?
对于某些数据类型,您可能看不到加速,但最坏情况下,它将与现有方法一样好。考虑这个检查表中缺失值的示例
singleVar = single([1;3;5;7;9;11;13]);
cellstrVar = {“一个”“三”“七”“九”“十一”“13”};
categoryVar = categorical({“红色”“黄色”“蓝”“紫色”“紫外线”“橙”});
dateVar = [datetime(2015,1:7,15)]';
stringVar = [“一个”“b”“c”“d”“e”“f”“g”];
mytable = table(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 = any(ismissing(mytable),“所有”
TF =逻辑
1
现在,我们可以做了
TF = anymissing(mytable)
TF =逻辑
1
时间是相同的,所以我们可以一直安全地使用这些新函数。让我们运行5000次看看
抽搐
Repeats = 5e3;
我= 1:重复
Tf = any(ismissing(mytable),“所有”);
结束
oldMethodTime = toc
oldMethodTime = 0.4411
抽搐
我= 1:重复
Tf = anymissing(mytable);
结束
newMethodTime = toc
newMethodTime = 0.3786

更新MathWorks代码以使用这些新函数

我们已经开始在很多MATLAB函数中直接使用这些新函数。它们用于expm、logm和median等函数的参数验证。例如,通过查看源代码,您可以自己查看一下
编辑sqrtm

轮到你了

在R2022a这样大的版本中,有许多闪亮的功能,像这些简单的功能往往会被忽视。然而,它们是执行常见操作的有用新方法。MathWorks的团队已经开始在代码库中使用它们,在这里和那里进行改进,我相信我很快就会有机会在用户的代码中使用它们。
你认为它们在你的工作流程中有用吗?有没有什么相似的函数是你希望MATLAB能有的?
|

コメント

コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。