Performance matlab多列矩阵索引
假设我有一个IxJ值矩阵Performance matlab多列矩阵索引,performance,matlab,matrix,indexing,vectorization,Performance,Matlab,Matrix,Indexing,Vectorization,假设我有一个IxJ值矩阵 V= [1,4;2,5;3,6]; 和索引的IxR矩阵X X = [1 2 1 ; 1 2 2 ; 2 1 2]; 我想要得到一个矩阵Vx,它是IxR,对于每一行I,我想要读取R乘以V的(可能)不同列,这是由X中每个对应列中的数字给出的 Vx(i,r) = V(i,X(i,r)). 例如,在这种情况下 Vx = [1,4,1;2,5,5;6,3,6]; 非常感谢任何能快速完成此任务(无任何循环)的帮助 因此,您想要实现的是使用矢量化来实现速度。这是MATLAB的
V= [1,4;2,5;3,6];
和索引的IxR矩阵X
X = [1 2 1 ; 1 2 2 ; 2 1 2];
我想要得到一个矩阵Vx,它是IxR,对于每一行I,我想要读取R乘以V的(可能)不同列,这是由X中每个对应列中的数字给出的
Vx(i,r) = V(i,X(i,r)).
例如,在这种情况下
Vx = [1,4,1;2,5,5;6,3,6];
非常感谢任何能快速完成此任务(无任何循环)的帮助 因此,您想要实现的是使用矢量化来实现速度。这是MATLAB的主要优势之一。您需要的是一个矩阵(
index
,在下面的代码中),其元素是线性索引,将用于从源矩阵中选择值(V
)。前两行代码的作用与sub2ind
完全相同,将下标转换为线性索引。我这样编码是为了让索引转换的逻辑清晰
[m,n] = ndgrid(1:size(X,1),1:size(X,2));
index = m + (X-1)*size(X,1);
Vx = V(index);
另一种方法是结合使用
sub2ind
接受行和列的位置,输出是列的主要线性索引,可用于将访问矢量化到矩阵中。具体来说,您需要构建一个与X
大小相同的行索引和列索引的二维矩阵,其中列索引被精确指定为X
,但我们所关注的每一行的行索引都是相同的。具体地说,该矩阵的第一行将全部为1,下一行全部为2,以此类推。要构建该行矩阵,首先生成一个列向量,该向量从1到X
的行数,并对X
中的列数进行复制。使用此新矩阵和X
,使用sub2ind
生成列主要线性索引,最终索引V
生成矩阵Vx
:
subs = repmat((1:size(X,1)).', [1 size(X,2)]); %'
ind = sub2ind(size(X), subs, X);
Vx = V(ind);
您可以使用以获得有效的解决方案-
N = size(V,1)
Vx = V(bsxfun(@plus,[1:N]',(X-1)*N))
样本运行-
>> V
V =
1 4
2 5
3 6
>> X
X =
1 2 1
1 2 2
2 1 2
>> N = size(V,1);
Vx = V(bsxfun(@plus,[1:N]',(X-1)*N))
Vx =
1 4 1
2 5 5
6 3 6