arrays - 是否可以使用索引数组对三维数组的二维进行索引?

标签 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. 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)))

关于arrays - 是否可以使用索引数组对三维数组的二维进行索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19915171/

相关文章:

c++ - 将 Matlab 转换为 C++

matlab - 在 Matlab 中转置矩阵和求解线性系统时出现奇怪的数值错误

javascript - 将数组作为字符串返回 JavaScript

c++ - 如何使模板重新推导出已经衰减为 const char* 的 const char[N] "mychar"?

Java 字节移位

matlab - 是否可以在 MATLAB 中的表达式上应用冒号运算符?

matlab - 使用 VideoReader 时出现错误消息

java - 如何检查一个int数组是否是一个循环排序的数组?

javascript - 从值中更改具有一个属性的对象的键

arrays - 如何创建从 MATLAB 中的结构体中提取的值的字符串数组?