我知道在 MATLAB 中,在 1D 情况下,您可以选择具有索引的元素,例如 a([1 5 3])
,以返回 a 的第 1、5 和 3 个元素.我有一个二维数组,想根据我拥有的一组元组来选择单个元素。所以我可能想要获取a(1,3)、a(1,4)、a(2,5)
等等。目前我拥有的最好的是 diag(a(tuples(:,1), tuples(:,2))
,但是对于较大的 a 和/或元组,这需要大量的内存。我必须将这些元组转换为线性索引,还是有一种更简洁的方法可以在不占用太多内存的情况下完成我想要的?
最佳答案
转换为线性索引似乎是一种合法的方式:
indices = tuples(:, 1) + size(a,1)*(tuples(:,2)-1);
selection = a(indices);
请注意,这也在 Matlab 内置解决方案 sub2ind
中实现,如 nate'2 中的答案:
a(sub2ind(size(a), tuples(:,1),tuples(:,2)))
但是,
a = rand(50);
tuples = [1,1; 1,4; 2,5];
start = tic;
for ii = 1:1e4
indices = tuples(:,1) + size(a,1)*(tuples(:,2)-1); end
time1 = toc(start);
start = tic;
for ii = 1:1e4
sub2ind(size(a),tuples(:,1),tuples(:,2)); end
time2 = toc(start);
round(time2/time1)
给出
ans =
38
因此,虽然 sub2ind
在视觉上更轻松,但它也 慢了 ~40 倍。如果您必须经常进行此操作,请选择上述方法。否则,使用 sub2ind
来提高可读性。
关于arrays - 在 MATLAB 中从数组中选择元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13023997/