MATLAB中两个嵌套for循环的矢量化
我有两个嵌套的for循环,用于格式化加载的数据。这些回路具有以下结构:MATLAB中两个嵌套for循环的矢量化,matlab,for-loop,vectorization,Matlab,For Loop,Vectorization,我有两个嵌套的for循环,用于格式化加载的数据。这些回路具有以下结构: data = magic(20000); data = data(:,1:3); for i=0:10 for j=0:10 data_tmp = data((1:100)+100*j+100*10*i,:); vx(:, i+1,j+1) = data_tmp(:,1); vy(:, i+1,j+1) = data_tmp(:,2); vz(:, i
data = magic(20000);
data = data(:,1:3);
for i=0:10
for j=0:10
data_tmp = data((1:100)+100*j+100*10*i,:);
vx(:, i+1,j+1) = data_tmp(:,1);
vy(:, i+1,j+1) = data_tmp(:,2);
vz(:, i+1,j+1) = data_tmp(:,3);
end
end
数组
vx
、vy
和vz
我会预先分配到所需的大小。但是,是否有一种方法可以将-循环的矢量化以提高效率?由于第二个循环中的第一行,data((1:100)+100*j+100*10*I,:)
,我不认为是这样,有更好的方法吗 结果是循环中有重复的索引
当i=k,j=10
和i=k+1,j=0
为k时,循环中出现了重复索引
对于k的i=k,j=10
和i=k+1,j=0
,如果你想坚持循环,这里有一个更快的方法:
data = randi(100,20000,3);
[vx,vy,vz] = deal(zeros(100,11,11));
[J,I] = ndgrid(1:11,1:11);
c = 1;
for k = 0:100:11000
vx(:,I(c),J(c)) = data((1:100)+k,1);
vy(:,I(c),J(c)) = data((1:100)+k,2);
vz(:,I(c),J(c)) = data((1:100)+k,3);
c = c+1;
end
我猜@Dohyun的重塑
答案就是你想要的(它比这个快x10倍,比你的代码快x10000倍),但是下次你使用循环时,这可能会很有用
这是另一个不使用重塑
的选项,时间与重塑
版本相似:
[vx,vy,vz] = deal(zeros(100,10,11));
vx(:) = data(1:11000,1);
vy(:) = data(1:11000,2);
vz(:) = data(1:11000,3);
vx = permute(vx,[1 3 2]);
vy = permute(vy,[1 3 2]);
vz = permute(vz,[1 3 2]);
这样做的目的是在分配它们时定义[vx,vy,vz]
的形状。如果您想坚持循环,这里有一种更快的方法:
data = randi(100,20000,3);
[vx,vy,vz] = deal(zeros(100,11,11));
[J,I] = ndgrid(1:11,1:11);
c = 1;
for k = 0:100:11000
vx(:,I(c),J(c)) = data((1:100)+k,1);
vy(:,I(c),J(c)) = data((1:100)+k,2);
vz(:,I(c),J(c)) = data((1:100)+k,3);
c = c+1;
end
我猜@Dohyun的重塑
答案就是你想要的(它比这个快x10倍,比你的代码快x10000倍),但是下次你使用循环时,这可能会很有用
这是另一个不使用重塑
的选项,时间与重塑
版本相似:
[vx,vy,vz] = deal(zeros(100,10,11));
vx(:) = data(1:11000,1);
vy(:) = data(1:11000,2);
vz(:) = data(1:11000,3);
vx = permute(vx,[1 3 2]);
vy = permute(vy,[1 3 2]);
vz = permute(vz,[1 3 2]);
其思想是在分配它们时定义[vx,vy,vz]
的形状
[vx,vy,vz] = deal(zeros(100,10,11));
vx(:) = data(1:11000,1);
vy(:) = data(1:11000,2);
vz(:) = data(1:11000,3);
vx = permute(vx,[1 3 2]);
vy = permute(vy,[1 3 2]);
vz = permute(vz,[1 3 2]);