我已阅读了示例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循环?
根据给出的答案,我已经更新了问题。
答案 0 :(得分:3)
您的代码存在两个问题:
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)))