【发布时间】:2015-05-15 02:29:42
【问题描述】:
我正在尝试在 Matlab 中编写一个循环,该循环迭代地求解零和一的最佳向量 s。这是我的代码
N = 150;
s = ones(N,1);
for i = 1:N
if s(i) == 0
i = i + 1;
else
i = i;
end
select = s;
HI = (item_c' * (weights.*s)) * (1/(weights'*s));
s(i) = 0;
CI = (item_c' * (weights.*s)) * (1/(weights'*s));
standarderror_afterex = sqrt(var(CI - CM));
standarderror_priorex = sqrt(var(HI - CM));
ratio = (standarderror_afterex - standarderror_priorex)/(abs(mean(weights.*s) - weights'*select));
ratios(i) = ratio;
s(i) = 1;
end
[M,I] = min(ratios);
s(I) = 0;
此代码将 s 中的元素设置为零,它具有最低的比率。但是我需要重新开始这个过程,使用带有一个零的新 s 来查找比率并排除 s 中比率最低的元素。我需要一遍又一遍,直到没有比率是负的。
我需要另一个循环,还是我错过了什么?
我希望我的问题足够清楚,如果您需要我解释更多,请告诉我。
提前感谢您帮助新手程序员。
编辑
我认为我还需要添加某种形式的 while 循环。但我看不出如何构建它。这就是我想要的流程
包含所有项目(s(i) = 1 表示所有 i),计算 HI、CI 和标准误并列出比率,排除对应于最低负比率的项目 i (s(I) = 0)。
使用新的 s,包括除一个零之外的所有 1,计算 HI、CI 和标准误并列出比率,排除对应于最低负比率的第 i 项。
使用新的 s,现在包括除两个零之外的所有 1,重复该过程。
这样做直到没有要排除的比率中的负元素为止。
希望现在更清楚了。
【问题讨论】:
-
我没有 100% 关注正在发生的事情,但我强烈怀疑您的问题与尝试修改循环索引有关。当您在循环内修改
i时,我实际上不确定在 MATLAB(或任何其他具有这种 for 循环语法风格的语言)中会发生什么,但我认为在下一次迭代中它很可能只是无论如何,它都会被设置为下一步。因此,在您的情况下,我怀疑循环体不会像您预期的那样在~(s(i) == 0)的情况下重复。我建议切换到类似i=1; while i<=N; ...; end -
我对循环索引进行了修改,因为如果之前已将
s(i)设置为零,我不希望将其设置为 1。但我想这是一种不好的做法,对吧? -
如果你只是把循环的内部放在
if s(i)~=0循环里面会起作用吗?