Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance matlab多列矩阵索引_Performance_Matlab_Matrix_Indexing_Vectorization - Fatal编程技术网

Performance matlab多列矩阵索引

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的

假设我有一个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的主要优势之一。您需要的是一个矩阵(
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