罗兰的MATLAB艺术

将想法转化为MATLAB

索引-混合它

我写了很多相关的文章索引,但我仍然没有表现出所允许的所有灵活性。今天我将在这个列表中添加一个变体。

内容

索引类型-回顾

让我们从使用下标进行索引开始。让我们从创建一个矩阵开始。

A = [1 2 3 4;5 6 7 8;9 10 11 12;13 14 15 16]
A = 12 3 4 5 6 7 8 9 10 11 12 13 14 15 16

如果我想找出第二行第三列的元素,我就这样写

el23 =(2、3)
el23 = 7

结果是7。

如果我还想要另一个元素,比如第4行,第2个元素,我当然可以用一个类似的表述。

el42 = (4,2)
el42 = 14

如果我想提取这两个元素,我可以尝试组合它们各自的行索引和列索引。

els = A([2 4],[3 2])
Els = 7 6 15 14

你看到的是MATLAB返回了4个交点,不仅仅是第一行的第一列索引,第二行也是如此。相反,我们将每个行索引与每个列索引结合起来。为了只得到我们最初寻找的两个元素,我们可以把下标转换成另一种形式的索引,线性索引。对于线性索引,我们认为数组是从(1,1)元素开始,然后沿着每一行,将元素串成一个长列。然后我们对列向量进行计数,它的长度等于numRows * numCols.使用sub2ind来进行转变。

linInds = sub2ind(size(A),[2 4],[3,2])
8 . b

然后用这些索引返回一个

(linInds)
n = 7 14

正好得到期望的值。

至少我希望它们是你所期望的值,而不是10和8。记住,MATLAB按列存储数组值,即一列接着一列。

索引的组合方式

现在考虑另一种情况,您有一个矩阵,您只想提取特定的列,这取决于对应行的值。也许,例如,您正在使用作为占位符,你只需要行中的第2列和第4列开始

一个对我们有用的函数是isnan的输出isnan是一个逻辑数组(思考真正的).如果有这样一个向量D,

D = [1 NaN 3 -4 NaN pi]'
D = 1 NaN 3 -4 NaN 3.1416

我可以确定哪些项有值。

nanD = isnan (D);谁与非与非
名称大小字节类属性nanD 6x1 6 logical nanD = 0 1 0 0 1 0

我可以建立逻辑索引来提取非|NaN|项D

nonNaND = D (~ nanD)
nonNaND = 1 3 -4 3.1416

结合技术

现在我准备把逻辑索引和规则下标的概念结合起来。这里有一些数据。

Data =兰德(10、5)
数据= 0.81472 0.15761 0.65574 0.70605 0.43874 0.90579 0.97059 0.035712 0.031833 0.38156 0.12699 0.95717 0.84913 0.27692 0.76599 0.01338 0.48538 0.93399 0.046171 0.7952 0.63236 0.80028 0.67874 0.097132 0.18687 0.09754 0.48976 0.2785 0.42176 0.69488 0.91574 0.39223 0.3171 0.64631 0.95751 0.792210.65548 0.95022 0.70936 0.96489 0.95949 0.17119 0.034446 0.75469

我把第2列和第5列提出来,如果第一列至少是0.8。我把第一列也留下,这样你就可以追踪发生了什么。

extractD = Data(Data(:,1)>=0.8,[1 2 5])
extractD = 0.81472 0.15761 0.43874 0.90579 0.97059 0.38156 0.91338 0.48538 0.7952 0.95751 0.79221 0.70936 0.96489 0.95949 0.75469

你有组合索引技术吗?

如果你有,当你把不同种类的索引混合到一个数组时,你试图完成什么。




与MATLAB®7.11发布

|
  • 打印
  • 发送电子邮件

评论

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