2015-06-30 117 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