是否可以使用索引数组索引到三维数组的两个维度?

时间:2013-11-11 20:20:45

标签: arrays matlab

我已阅读了示例here,但似乎并未包含以下情况。

A成为维度为128 x 128 x 3的三维数组。

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

rng(1);                                         
choicex = randi(128, 1, 16)                
choicey = randi(128, 1, 16)                 
random_values = A(choicex, choicey,:)  

不幸的是,矩阵random_values现在是16 x 16 x 3,当我希望它为16 x 3时。 取一片这不起作用,因为那时所有的第一个指数都是相同的,或者所有的第二个指数都是相同的。 我不要求random_values带有原始索引。

有没有办法在matlab中直接使用索引表示法实现这一点,而无需编写for循环?

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

1 个答案:

答案 0 :(得分:3)

您的代码存在两个问题:

  1. randi(nmax, i, j)返回来自(i,j)的随机整数的1..nmax矩阵。在您的情况下,nmax显然必须是128,而不是256。

  2. matlab具有基于1的索引,而不是基于0的索引,因此不要减去1。

  3. 这对我有用:

    >> 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个三元组。使用sub2ind可以实现您真正想要的,但这不是一个简单的表达方式:

    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)))