2015-05-29 101 views
2

我有以下代碼:矩陣預分配 - MATLAB

clear; clc; 

a = [1,2,3,4,3]; 

b = zeros(1,5); 
for i = 1:4 
    for j = i+1:5 
     if a(i) == a(j) 
      b = [b,i]; 
     end 
    end 
end 
b 

b是從級聯的雙for循環內部元件產生的陣列。儘管我聲明數組b = zeros(1,5)MATLAB警告我說,b需要預先分配。我應該如何修改代碼,所以MATLAB停止警告我要預分配?

回答

2

的問題是級聯步b = [b, i]您的零矩陣後將追加ib所以你只是puting號。你想要的是分配到的bb(???)=i特定的元素,???需求,以便去那麼最簡單的方法只保留一個單獨的計數器變量。

clear; clc; 

a = [1,2,3,4,3]; 

b = zeros(1,5); 
counter = 1; 
for i = 1:4 
    for j = i+1:5 
     if a(i) == a(j) 
      b(counter) = i; 
      counter = counter + 1; 
     end 
    end 
end 

b 

請注意,您需要在這個例子中通過分配b,因爲你真的不知道前期將有多少元素在年底,如果你的例子實際上是這簡單的話,我會很可能只是除非你發現你的代碼是慢

2

嘗試以下忽略在這種情況下警告。您已正確預分配的數組,但在預分配你又嘗試用語句B動態地擴展它= [B,I]。這將會在5個零之後連接新的元素。

clear; clc;  
a = [1,2,3,4,3]; 
b = zeros(1,5); 
b_idx=0; 
for i = 1:4 
    for j = i+1:5 
     if a(i) == a(j) 
      b_idx = b_idx+1; 
      b(b_idx) = i; 
     end 
    end 
end 
disp(b);