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
MATLAB中两个嵌套for循环的矢量化_Matlab_For Loop_Vectorization - Fatal编程技术网

MATLAB中两个嵌套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

我有两个嵌套的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+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]);