2015-06-30 122 views
0

第一遍,一切都很好。 i = 49,j = 1,k = 1112.在第二遍中,i和j移動到下一個變量(50和18),但k保持在1112.它在第三和第四遍時做同樣的事情。結果是consolFut1不斷被覆蓋。有人能指出我的錯誤嗎?我對讀書表示最誠摯的感謝。爲什麼這個for循環移動到下一個變量?

for i = 49:52 
    expiry=find(vifDate==expDate(i)); 
    for j = [1; 18; 43; 63] 
     vifCls1 = vifCls(j:expiry); 
     for k = [1112; 1129; 1154; 1174] 
      consolFut1 = consolFut(k:expDateIdx(i),i); 
      arbVIF=vifCls1-consolFut1; 
     end 
    end 
end 
+1

使用[調試器](http://www.mathworks.com/help/matlab/matlab_prog/debugging-process-and-features.html#brqxeeu-177)遍歷代碼。 – excaza

+6

嘗試行向量,即對於k = [1112,1129,1154,1174]' – Dan

+0

@Dan是正確的。默認情況下,當將一個矩陣指定爲要在循環中迭代的變量時,它會遍歷每列,因此'k'實際上是'[1112,1129,1154,1174]'的單個向量,而不是預期的單個值1112. – rayryeng

回答

2

所以看起來你真正想要做的是計算值4次,每次從你的載體i, j and k相應的元素:

i = [ 49 50 51 52] 
j = [ 1 18 43 63] 
k = [1112 1129 1154 1174] 

你需要做的是創建一個作爲所有這三個向量的索引的新變量。我會叫它x

for x = 1:length(i) %// == length(j) == length(k) 
    %// add index (x) to all i, j and k 
    expiry=find(vifDate==expDate(i(x))); 
    vifCls1 = vifCls(j(x):expiry); 
    consolFut1 = consolFut(k(x):expDateIdx(i(x)),i(x)); 
    %// Save results in arbVIF... 
    %// use cell array since results will be of varying length 
    arbVIF{x}=vifCls1-consolFut1; 
end 

我所做的假設arbVIF是你想擺脫這一切的價值,你不希望它通過每次循環覆蓋。因此,我也在其中添加了索引(x),因此在循環結尾arbVIF(1:4)將包含循環的每次迭代的結果。 (讓我知道你是否需要不同的東西。)

請注意,使用ij作爲變量通常不是一個好主意。見Using i and j as variables in Matlab

+0

感謝燒杯,一切正常,直到arbVIF行,其中Matlab說「 在賦值A(I)= B,B和I中元素的數量必須相同。我做錯了什麼? – kits

+0

好的,結果必須有不同的長度。嘗試使用大括號將其更改爲'arbVIF {x}'。這會將其更改爲單元陣列。 – beaker

+0

謝謝燒杯,這工作很好!我將在未來避免使用i和j作爲變量。 – kits