所有矩阵元素都是有限的吗?用老方法。
你如何检查一个矩阵的所有元素是否都是有限的?这是一个矩阵,答案是“不”。
=兰德(3),(2,2)=正无穷
0.6945 0.8625 0.0988 0.0722 Inf 0.7485 0.8283 0.2797 0.5190
用于测试if的通用模式
每一个
矩阵中的元素是有限的,首先应用
isfinite
函数,返回一个逻辑数组:
checkFinite = isfinite(a)
然后把这个传递给
所有
函数,该函数检查每列的所有项是否为
真正的
或不
checkAllRowsFinite = all(checkFinite)
我们应用
所有
再执行一次函数以得到我们想要的结果
checkAllFinite = all(checkAllRowsFinite)
不!原始矩阵的所有元素都不是有限的!通常,以上所有内容都放在一行中:
checkAllFinite = all(所有(isfinite(a)))
这是多年来常见的模式,当处理多维数组时,事情可能会失控。例如,检查是否的每个元素
是有限的,我们需要做什么
checkAllFinite = all(all(all(all(isfinite(a)))))
那是很多
所有
!有些人使用简洁但可以说是神秘的
checkAllFinite = all(isfinite(a(:))))
所以,在R2018b中,我们引入了一种更好读的新方法
checkAllFinite = all(isfinite(a)),“所有”)
R2022a新增:allfinite -查找是否all是有限的,快速
我们在自己的代码和用户的代码中经常看到这些模式。以至于在R2022a中,我们开发了另一个函数来更容易地执行这个常见的操作:
allfinite
CheckAllFinite = allfinite(a)
我们这样做并不仅仅是为了节省输入。我们这么做是因为这样更快!你可以看到大量小矩阵的最大区别。让我们看看1000万个3 × 3矩阵。
Tf = all(isfinite(a3),“所有”);
流(allfinite(a3)是%。2f times faster than all(isfinite(a3), 'all') for "+...
“1000万个小矩阵\n”oldMethodTime / newMethodTime)
对于1000万个小矩阵,Allfinite (a3)比all(isfinite(a3), 'all')快8.93倍
这就导致了函数调用次数的巨大差异。对于较大的矩阵,这种好处会减少,但它仍然有用
Tf = all(isfinite(a2000),“所有”);
流(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
.
在使用数组时,几乎总是会有一个加速,尽管您可能需要运行多次才能看到它。
流(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),“所有”)
现在,我们可以做了
时间是相同的,所以我们可以一直安全地使用这些新函数。让我们运行5000次看看
Tf = any(ismissing(mytable),“所有”);
Tf = anymissing(mytable);
更新MathWorks代码以使用这些新函数
我们已经开始在很多MATLAB函数中直接使用这些新函数。它们用于expm、logm和median等函数的参数验证。例如,通过查看源代码,您可以自己查看一下
轮到你了
在R2022a这样大的版本中,有许多闪亮的功能,像这些简单的功能往往会被忽视。然而,它们是执行常见操作的有用新方法。MathWorks的团队已经开始在代码库中使用它们,在这里和那里进行改进,我相信我很快就会有机会在用户的代码中使用它们。
你认为它们在你的工作流程中有用吗?有没有什么相似的函数是你希望MATLAB能有的?
コメント
コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。