Arrays 是否可以使用索引数组将三维数组索引为二维?

Arrays 是否可以使用索引数组将三维数组索引为二维?,arrays,matlab,Arrays,Matlab,我已经通读了这些例子,但似乎没有包括下面的例子 设A为三维数组,其尺寸128 x 128 x 3 我想从这个数组中随机选取3个整数的集合,通过为前两个维度选取随机对。这是我目前的尝试: rng(1); choicex = randi(128, 1, 16) choicey = randi(128, 1, 16) random_values = A(c

我已经通读了这些例子,但似乎没有包括下面的例子

A
为三维数组,其尺寸
128 x 128 x 3

我想从这个数组中随机选取3个整数的集合,通过为前两个维度选取随机对。这是我目前的尝试:

rng(1);                                         
choicex = randi(128, 1, 16)                
choicey = randi(128, 1, 16)                 
random_values = A(choicex, choicey,:)  
不幸的是,矩阵
随机_值
现在是
16x16x3
,而我希望它是
16x3
。 只取其中一部分是不可行的,因为这样一来,要么所有第一个索引都相同,要么所有第二个索引都相同。 我不要求
随机值
携带原始索引

有没有办法在matlab中直接使用索引符号实现这一点,而不必编写for循环


根据给出的答案,我已更新了问题。

您的代码有两个问题:

  • 1..nmax
    返回随机整数的大小
    (i,j)
    矩阵。在您的例子中,
    nmax
    显然必须是128,而不是256

  • matlab有基于1的索引,而不是基于0的索引,所以不要减去1

  • 这对我很有用:

    >> A = randn(128,128,3);
    >> choicex = randi(128, 1, 16);
    >> choicey = randi(128, 1, 16);
    >> B = A(choicex, choicey,:);
    >> size(B)
    
    ans =
    
        16    16     3
    
    但这将给出给定行和列的所有组合上的所有三元组,总共256个三元组。你真正想要的东西是可以实现的,但这不是一个简单的表达:

    A(sub2ind(size(A), repmat(choicex,3,1), repmat(choicey,3,1), ...
        repmat([1;2;3],1,16)))
    
    或少几个字符:

    A(sub2ind(size(A), [1;1;1]*choicex, [1;1;1]*choicey, [1;2;3]*ones(1,16)))
    

    +1,您的答案确实解决了错误,但我正在尝试获得16组3个值,而不是256组3个值。如果我将上面的
    4
    替换为
    16
    ,则将获得16个值,但所选点之间将有共享索引。