Matrix 如何在julia中搜索矩阵中的值?

Matrix 如何在julia中搜索矩阵中的值?,matrix,julia,Matrix,Julia,l有l个mn(15000 2300)矩阵,我想提取整个矩阵大于3000或小于700的值,然后只在列上,然后只在行中。我怎么能做到呢。 我们有一个函数find(x->(x==3),m),它返回一个值的索引 但对于矩阵我需要它,我在寻找像m[1,5],m[2,6]这样的结果。。。。。等等我怎么能做到 m= rand (1:5000,60,40) 谢谢只需提取满足条件的值 如果您只想提取矩阵中满足条件的值,例如,不需要知道它们的位置,您可以直接使用find()或filter()函数。最简单的方法是

l有l个mn(15000 2300)矩阵,我想提取整个矩阵大于3000或小于700的值,然后只在列上,然后只在行中。我怎么能做到呢。 我们有一个函数
find(x->(x==3),m)
,它返回一个值的索引 但对于矩阵我需要它,我在寻找像m[1,5],m[2,6]这样的结果。。。。。等等我怎么能做到

m= rand (1:5000,60,40) 

谢谢

只需提取满足条件的值

如果您只想提取矩阵中满足条件的值,例如,不需要知道它们的位置,您可以直接使用
find()
filter()
函数。最简单的方法是使用
filter()

请注意,对于多维数组,您可以使用两个索引(例如
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(大小(m),idx)
更方便一些)

从文件中:

ind2sub(dims,索引)->下标

将下标元组返回到维度为dims的数组中, 对应于线性指数

因此,
subs
对象的第一个元素将是矩阵中满足条件的位置的所有行坐标,而
subs
对象的第二个元素将是矩阵的所有列坐标。因此,例如

subs[1][1], subs[2][1]
将为满足条件的条目提供第一个完整坐标

提取包含满足条件的条目的所有行

因此,类似地,如果要查找并提取包含满足条件的条目的所有行,可以使用

row_idx = unique(subs[1])
m_rows = m[row_idx,:]

您可以获得索引和值作为具有良好列表理解的元组:

[(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)]
[(i,j,m[i,j]),对于i in 1:size(m,1),j in 1:size(m,2),如果(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)]
[m[i,j]表示i in 1:size(m,1),j in 1:size(m,2)如果(m[i,j]>3000)|(m[i,j]<700)]

等等(这就是你想做的吗?对不起,这个问题我有点不清楚)。

迈克尔·奥尔洛格的回答是
map(x->ind2sub(m,x),find(x->(x<700 | x>3000),m))
你在寻找什么?实际上,更好的方法可能是使用
ind2sub的向量形式,如下所示:
collect(zip(ind2sub(m,find(x->(x<700 | x>3000),m))…)
。如果没有
collect
,这是可编辑的,这可能就是结果的使用方式。当然,结果与前面的注释相同。
[(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] for i in 1:size(m,1), j in 1:size(m,2) if (m[i,j] > 3000) | (m[i,j] < 700)]