我已阅读示例 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循环?
根据给定的答案,我已经更新了问题。
最佳答案
您的代码有两个问题:
randi(nmax, i, j)
返回(i,j)
大小的矩阵,其中包含1..nmax
中的随机整数。在您的情况下,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)))
关于arrays - 是否可以使用索引数组对三维数组的二维进行索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915171/