Julia-通过向量提取多维矩阵的一部分

时间:2016-07-26 15:14:08

标签: arrays matrix julia

我试图用矢量减少多维矩阵。

让我们说矩阵A是1000 x 10 x 100。 向量b可以是100 x 1,其中100个条目是A的第一维的一部分。在A的第一维的切片中始终只有一个元素匹配b的每个元素。

如何将矩阵缩小为匹配向量?

我试过

Ared= A[b,:,:]

但它不起作用。

此示例中的新Matrix应具有100 x 10 x 100

的格式

有没有人有任何想法?

2 个答案:

答案 0 :(得分:1)

好的,我想我知道你在问什么。您正在寻找findin()功能。它需要两个参数,每个参数都是一个集合。它找到第一个集合中第二个元素的元素,并返回它们的索引。因此,我们可以将此函数应用于数组第一维的切片。以下是示例,从2D开始,为简单起见,然后概括为3D,这实际上基本相同。

请注意,有必要沿第二维和第三维选择特定的索引(这里我为每个选择1),否则,第一维切片中没有明确的元素可以与{{1}的内容进行比较}。 (每个维度只提供一部分,在这种情况下,一组3个数字在一起识别3D阵列中的特定位置)。

b

答案 1 :(得分:0)

您的逻辑很好,如果b是矢量,则可以。它没有的原因是你可能试图使用二维数组(即秩2)进行索引,该数组恰好只有一列,而不是一个向量(即秩1)数组。即我确定如果你做size(b),结果将是(2,1)而不是(2,),这应该是原来的。

如果你获得b的相应向量,(例如collect(b)),你的索引操作应该可以正常工作。

示例:

julia> A = rand(Int64[1,10],3,4,2)
3x4x2 Array{Int64,3}:
[:, :, 1] =
 10  10   1  10
 10  10  10  10
  1  10  10   1

[:, :, 2] =
 1  10  10   1
 1  10   1   1
 1   1  10  10

julia> b = [1; 3]    # this will work. NOTE THE RESULTING TYPE!
2-element Array{Int64,1}:
 1
 3

julia> A[b,:,:]
2x4x2 Array{Int64,3}:
[:, :, 1] =
 10  10   1  10
  1  10  10   1

[:, :, 2] =
 1  10  10   1
 1   1  10  10

julia> c = [1 3]'    # this will not. NOTE THE RESULTING TYPE
2x1 Array{Int64,2}:
 1
 3

julia> A[c,:,:]
ERROR: MethodError: `index_shape_dim` has no method matching     index_shape_dim(::Array{Int64,3}, ::Int64, ::Array{Int64,2}, ::Colon, ::Colon)

julia> A[collect(c),:,:]    # this will work again, c is now a vector
2x4x2 Array{Int64,3}:
[:, :, 1] =
 10  10   1  10
  1  10  10   1

[:, :, 2] =
 1  10  10   1
 1   1  10  10