2

我已阅读此处的示例,但似乎不包括以下情况。

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 316 x 3random_values

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

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

4

1 回答 1

3

您的代码有两个问题:

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

  2. 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)))
于 2013-11-11T20:26:10.077 回答