2015-06-21 77 views
1

我需要在下面的代碼中預先分配數組。 我不太明白如何在多循環迭代中預先分配數組。如何在多循環迭代中預分配數組

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 

回答

0

增加最內層循環的計數器來kepp軌道應填寫其中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; 
+0

太謝謝你了路易斯,這真的幫助了我! –