使用逻辑索引代替FIND

3
在我的代码循环中,我使用一行代码来查找并绘制某个势能的最小值(为了清晰起见:7对应包含潜在值的单元格,5对应x值):
plot(PDdata{subject,5}{1,1}(find(PDdata{subject,7}==...
    min(PDdata{subject,7}))),min(PDdata{subject,7}),'ko')

现在Matlab建议使用逻辑索引而不是FIND,虽然我只简要地研究了它,但它并不让我觉得我应该在这里这样做。因此,主要问题是我是否应该使用逻辑索引(我更喜欢保持一行!),如果是的话:如何使用?

提前道歉,因为我提出了一个这么小的问题,但我正在努力增加自己的Matlab知识,希望能得到一个简短的答案来帮助我!


5
如果你只是删除单词“find”,会发生什么?我现在无法尝试,但如果这种(逻辑索引)仍然可以给出推荐的结果,那么使用它确实比使用“find”更好。 - Dennis Jaheruddin
是的,谢谢,确实有效! - Fraukje
1个回答

5

丹尼斯在评论中是正确的。这个想法是直接使用逻辑索引可以省去一步。因此,如果您尝试提取矩阵中所有大于2的元素,例如,使用find,您将会这样做:

A = [1 3 2 1 4 1]
A(find(A>2))

这将变成类似于以下内容

A(find([0 1 0 0 1 0]))

那么

A([2, 5])

最后,
[3, 4]

然而,如果您直接像这样使用逻辑索引:

A(A>2)

你获得了:
A([0 0 1 0 0 1 0])

最后,
[3,4]

所以您将得到完全相同的结果,并且您可以跳过对于这些情况完全无关紧要的find函数调用。
另外值得一提的是,除非您的Matlab版本比较老,否则mlint(给出警告的部分)实际上可以帮您解决这个问题。如果您将鼠标悬停在红色下划线下的find上,则会看到以下内容:
所以这是一个恰好犯了这个错误的基本版本,在结尾处有一个小的fix按钮,单击后即可获得以下内容:
好的,虽然在这种情况下不是逻辑索引而是普通索引,但是重点在于,mlint可以为您修复这个问题,这是非常棒的!

很酷,是的,我知道fix按钮,但很高兴知道这个功能被称为mlint。奇怪的细节:你放在那里的例子对我没有产生任何mlint(尽管它显然应该...)。 - Fraukje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接