如何在多循环迭代中预分配数组

时间:2015-06-21 22:47:40

标签: arrays matlab

我需要在下面的代码中预先分配数组。 我不太明白如何在多循环迭代中预先分配数组。

a=0:1:2;
b=0:1:2;
c=0:1:2;
xx1=[];yy1=[];zz1=[];xx2=[];yy2=[];zz2=[];

for k=1:length(c)-1;
    z1=c(k);    z2=c(k+1);
    for w=1:length(b)-1;
        y1=b(w);        y2=b(w+1);
        for q=1:length(a)-1;
            x1=a(q);            x2=a(q+1);
            xx1=[xx1;x1];            xx2=[xx2;x2];
            yy1=[yy1;y1];            yy2=[yy2;y2];
            zz1=[zz1;z1];            zz2=[zz2;z2];
        end
    end
end

预期结果如下:

[xx1 xx2 yy1 yy2 zz1 zz2]

ans =

     0     1     0     1     0     1
     1     2     0     1     0     1
     0     1     1     2     0     1
     1     2     1     2     0     1
     0     1     0     1     1     2
     1     2     0     1     1     2
     0     1     1     2     1     2
     1     2     1     2     1     2

1 个答案:

答案 0 :(得分:1)

在最里面的循环中增加一个计数器,以跟踪你应填写的xx1等条目。

a = 0:1:2;
b = 0:1:2;
c = 0:1:2;
xx1 = NaN((length(a)-1)*(length(b)-1)*(length(c)-1),1); %// preallocate 
xx2 = NaN((length(a)-1)*(length(b)-1)*(length(c)-1),1); 
yy1 = NaN((length(a)-1)*(length(b)-1)*(length(c)-1),1);
yy2 = NaN((length(a)-1)*(length(b)-1)*(length(c)-1),1); 
zz1 = NaN((length(a)-1)*(length(b)-1)*(length(c)-1),1); 
zz2 = NaN((length(a)-1)*(length(b)-1)*(length(c)-1),1);
n = 0; %// initiallize counter
for k=1:length(c)-1;
    z1=c(k);    z2=c(k+1);
    for w=1:length(b)-1;
        y1=b(w);        y2=b(w+1);
        for q=1:length(a)-1;
            n = n + 1; %// increase counter;
            x1 = a(q);           
            x2 = a(q+1);
            xx1(n) = x1; %// fill values
            xx2(n) = x2;
            yy1(n) = y1;
            yy2(n) = y2;
            zz1(n) = z1;
            zz2(n) = z2;
        end
    end
end

无论如何,它可以在没有循环的情况下完成,适应this answer中给出的程序。这有两个好处:

  • 如果abc较大,可能会更快。
  • 相同的代码适用于任意数量的向量,而不仅仅是3.只需在下面的代码中相应地定义vectors1vectors2

没有循环的代码:

a = 0:1:2;
b = 0:1:2;
c = 0:1:2;
vectors1 = { a(1:end-1), b(1:end-1), c(1:end-1) };
vectors2 = { a(2:end), b(2:end), c(2:end) };
n = numel(vectors1);
combs1 = cell(1,n);
[combs1{:}] = ndgrid(vectors1{end:-1:1});
combs1 = reshape(cat(n+1, combs1{:}),[],n);
combs2 = cell(1,n);
[combs2{:}] = ndgrid(vectors2{end:-1:1});
combs2 = reshape(cat(n+1, combs2{:}),[],n);
result(:,2:2:2*n) = combs2;
result(:,1:2:2*n) = combs1;
相关问题