l具有m n的矩阵(15000 2300)并且我想要提取>>的值。 3000或者< 700表示整个矩阵,然后只在列上,然后只在行中。我怎么能这样做。
我们有一个函数find( x->(x == 3), m)
,它返回一个值的索引
但我需要一个矩阵,我正在寻找像m [1,5],m [2,6] .....等结果。我怎么能这样做?
m= rand (1:5000,60,40)
谢谢
答案 0 :(得分:7)
只需提取满足条件的值
如果您只想提取矩阵中满足条件的值,例如无需知道其位置,您可以直接使用find()
或filter()
函数。最简单的方法是filter()
:
filter(x-> (x < 700 | x > 3000), m)
将返回一个只包含满足条件的值的数组。同样,您可以使用find()
:
idx = find(x-> (x < 700 | x > 3000), m)
m[idx]
请注意,对于多维数组,您可以使用两个索引访问其元素,例如: m[1,2]
或一维指数,例如m[61]
。这些一维指数的惯例是他们对待,例如,矩阵只是所有列的一维堆栈。因此,例如上面代码中的m[idx]
。
获取满足条件的矩阵条目的坐标
上面,我提到了用于引用数组中元素的不同坐标/索引选项。我们可以使用ind2sub()
和sub2ind()
在它们之间来回切换。因此,例如,在上面的文字中,我可以知道m[1,2]
等同于m[61]
的一种方式是使用:
julia> sub2ind((60,40), 1, 2)
61
此函数的第一个参数指定数组的尺寸,然后在其后面给出您感兴趣的坐标。它返回与它们对应的一维索引。
这也可以很容易地反向工作,如果我们首先使用find()
函数给我们提供一维索引,这很方便:
subs = ind2sub((60,40),idx)
(我们也可以使用ind2sub(size(m),idx)
来获得更多便利)
来自文档:
ind2sub(dims,index) - &gt;标强>
将一个下标元组返回到一个维度为dims的数组中, 对应于线性指数指数。
因此,此处subs
对象的第一个元素将是满足条件的位置的矩阵的所有行坐标,subs
对象的第二个元素将是全部矩阵的列坐标。因此,例如,
subs[1][1], subs[2][1]
会为您提供满足您条件的条目的第一个完整坐标。
提取包含满足条件的条目的所有行
因此,类似地,如果您想查找并提取包含满足条件的条目的所有行,您可以使用
row_idx = unique(subs[1])
m_rows = m[row_idx,:]
答案 1 :(得分:1)
您可以将索引和值作为具有良好列表推导的元组获取:
[(i,j,m[i,j]) for i in 1:size(m,1), j in 1:size(m,2) if (m[i,j] > 3000) | (m[i,j] < 700)]
或只是列表中的m [i,j]值:
[m[i,j] for i in 1:size(m,1), j in 1:size(m,2) if (m[i,j] > 3000) | (m[i,j] < 700)]
等。 (这是你想要做的吗?抱歉,这个问题对我来说有点不清楚。)