首页 文章

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

提问于
浏览
2

我已经阅读了示例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 回答

  • 3

    您的代码有两个问题:

    • randi(nmax, i, j)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个三元组 . 使用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)))
    

相关问题