我试图用矢量减少多维矩阵。
让我们说矩阵A是1000 x 10 x 100。 向量b可以是100 x 1,其中100个条目是A的第一维的一部分。在A的第一维的切片中始终只有一个元素匹配b的每个元素。
如何将矩阵缩小为匹配向量?
我试过
Ared= A[b,:,:]
但它不起作用。
此示例中的新Matrix应具有100 x 10 x 100
的格式有没有人有任何想法?
答案 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