Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Julia-用向量提取多维矩阵的一部分_Arrays_Matrix_Julia - Fatal编程技术网

Arrays Julia-用向量提取多维矩阵的一部分

Arrays Julia-用向量提取多维矩阵的一部分,arrays,matrix,julia,Arrays,Matrix,Julia,我试图用向量来简化多维矩阵 假设矩阵A是1000 x 10 x 100。 向量b可以是100 x 1,其中100个条目是A的第一维度的一部分。A的第一维度的切片中始终只有一个元素与b的每个元素匹配 如何将矩阵简化为匹配向量 我试过了 Ared= A[b,:,:] 但它不起作用 本例中的新矩阵的形式应为100 x 10 x 100 有人有什么想法吗?好的,我想我明白你的意思了。您正在寻找findin()函数。它接受两个参数,每个参数都是一个集合。它查找第一个集合中位于第二个集合中的元素,并返回这

我试图用向量来简化多维矩阵

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

如何将矩阵简化为匹配向量

我试过了

Ared= A[b,:,:]
但它不起作用

本例中的新矩阵的形式应为100 x 10 x 100


有人有什么想法吗?

好的,我想我明白你的意思了。您正在寻找
findin()
函数。它接受两个参数,每个参数都是一个集合。它查找第一个集合中位于第二个集合中的元素,并返回这些元素的索引。因此,我们可以将此函数应用于数组第一维的切片。下面是一些例子,为了简单起见,从2D开始,然后推广到3D,基本上是一样的

请注意,有必要沿第二维度和第三维度选择特定的索引(这里我为每个维度选择1),因为否则,第一维度切片中没有明确的元素可与
b
的内容进行比较。(在本例中,每个维度仅提供一组3个数字的一部分,这些数字共同标识3D阵列中的特定位置)


如果b是一个向量,那么您的逻辑很好,并且可以工作。它不存在的原因是,您可能正在尝试使用二维数组(即秩2)进行索引,而该数组恰好只有一列,而不是向量(即秩1)数组。也就是说,我确信如果你做了
尺寸(b)
,结果将是
(2,1)
,而不是
(2,1)
,这是它应该做的

如果获得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

在A的第一维度中,始终只有一个元素与b的每个元素匹配。我不完全理解你的第二个问题。一般来说,我想创建一个与原始矩阵形状相同的新矩阵,但第一个维度被缩减为向量b。你的问题模棱两可,并吸引了两个相互矛盾但可能有效的答案,这取决于你实际想要的是什么;你能具体说明你想要什么吗?例如,如果“A”是
A=重塑(0.1:0.1:2.4,3,4,2)
且b是2元素向量,您能否给出
b
和预期输出的示例?
b
是要用于选择
a
子范围的行索引向量吗?(例如
b=[1;3]
)或者您是说“b可以从
A(1,:,:)
中的可用值中获取任意两个值”(例如
b=[0.4;1.9]
)?请澄清。如果是前者,请使用我的答案。如果是后者,请使用Michael的答案。如果两者都不是,请用适当的例子重新措辞并澄清您的问题。第一个答案解决了我的问题,但第二个答案在总体上也很有帮助。非常感谢您的帮助。很高兴您将其分类。请标记aNSWER你认为正确的接受,为未来的观众。(我仍然不确定你指的是哪一个,哈哈)谢谢你的快速回答!你写道,“100个随机行的意志现在有他们的第一个元素匹配的一个元素的B。“这些行与之前匹配的行不一样吗?@Hainmueck这只是为了创造一种情况,让匹配首先发生。换句话说,由于我实际上无法访问您使用的矩阵
A
和向量
b
,因此我需要模拟一种情况,在这种情况下,矩阵
A
与向量
b
具有某些匹配项。如果没有这一点,如果我只是从随机
a
和随机
b
开始,那么不太可能存在许多匹配项(取决于我随机抽取的方式)。@Hainmueck换句话说,这些行只是我的工作,为您生成一个最小的可复制示例;你可以在将来的问题中加入一些东西。有关这方面的更多详细信息,请参阅。
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