罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已存档,不会更新。

逻辑索引-多重条件

我讲过逻辑索引以前在一些链接的帖子,但最近的工作让我想再次炫耀它。逻辑索引的一个好处是,它非常容易和自然地结合不同条件的结果,根据多个标准选择项目。

内容

什么是逻辑索引?

假设我有一个未排序的整数数组,想要找出小于某个数字的整数。下面是我如何使用这个函数找到

X = randperm(20) target = 5;
X = 1 ~ 13列3 7 1 16 20 15 13 9 14 8 11 19 18 14 ~ 20列4 10 5 6 17 12 2
ind = find(X < target)
Ind = 1 3 14 20

可以看到find返回数组的下标X值小于目标.我们可以用这些来提取值。

Xtarget = X(ind)
Xtarget = 3 1 4 2

实现相同结果的另一种方法是使用逻辑表达式直接执行索引操作。这就是我的意思。

logInd = X < target
logInd = 1 ~ 13列1 0 1 0 0 0 0 0 0 0 0 0 14 ~ 20列1 0 0 0 0 0 0 1

MATLAB返回一个与数组元素匹配的数组X,每个元素都持有1,其中匹配的值在X是期望的值,否则为0。数组logInd不是双位数数组,而是有类的逻辑

logInd
名称大小字节类属性logInd 1x20 20逻辑

我现在可以使用这个数组从中提取所需的值X

XtargetLogical = X(logInd)
XtargetLogical = 3 1 4

这两个方法都返回结果。

isequal (Xtarget XtargetLogical)
Ans = 1

复合条件。

让我创建一个匿名函数,返回true (逻辑(1))用于偶数的值。

Iseven = @(x) ~logical(rem(x,2))
Iseven = @(x)~logical(rem(x,2))

测试iseven

iseven (1:5)
Ans = 0 1 0 10 0

找到满足不止一个条件的值

现在我想求的是X小于目标它们是偶的。这对于逻辑索引来说是非常自然的。我们已经有了需要的代码片段。

compoundCondInd = (X < target) & iseven(X)
compoundCondInd = 1 ~ 13列0 0 0 0 0 0 0 0 0 0 0 14 ~ 20列1 0 0 0 0 0 0 0 1

我们可以看到,我们在位置3和19找到了合适的值。然后我们可以提取这些值。

X (compoundCondInd)
Ans = 4 2

你注意到了吗?

你看到把多个条件组合起来有多简单了吗?我简单地寻找每个条件,返回逻辑数组,然后计算一个逻辑数组,其中两个输入数组都为真(通过).当然,我可以计算一个复合条件,其中只有一个或另一个条件需要使用逻辑或(通过|)为真。

最近的申请

我最近在查找可疑数据值的上下文中使用了这种方法。我有两个数组,每小时温度和速度。问题是,当温度接近或低于冰点时,速度传感器可能会冻结。但我不想删除冻结以下的所有值。所以我寻找温度足够低且速度非常低的数据(这可能意味着传感器被冻结了)。这样,我就不需要在低温下丢弃所有数据。

你用过复合索引吗?

你跟我一样,用逻辑表达吗?或者你用了其他的技巧?你想用复合索引达到什么目的?让我知道在这里




发布与MATLAB®R2012b


  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。