【问题标题】:Calculations on cell pairs that meet multiple pre-defined criteria?计算满足多个预定义标准的细胞对?
【发布时间】:2017-02-15 15:41:20
【问题描述】:

我的目标:根据每行中普遍存在的 5 个场景中的哪一个,按照 if 语句进行计算。最终结果应该是 1 列,包括每行计算的结果。

到目前为止我尝试了什么:

CalcOutcome = zeros(554,1);
  for k=height(MomPF)
        if MomPF.L_sum4t<0 & MomPF.U_sum4t>0           
            % make calc for every row but end result should only be 1 column
            % with the calc outcomes
            CalcOutcome=(-1)*MomPF.L_sum4t{k}*0.5 + MomPF.U_sum4t{k}*0.5;
        elseif MomPF.L_sum4t<0 & MomPF.U_sum4t<0
            CalcOutcome=(-1)*MomPF.L_sum4t{k}*1;
        elseif MomPF.L_sum4t>0 & MomPF.U_sum4t>0
            CalcOutcome=MomPF.U_sum4t{k}*1;
        elseif MomPF.L_sum4t>0 & MomPF.U_sum4t<0
            CalcOutcome=MomPF.L_sum4t{k}*0.5 + (-1)*MomPF.U_sum4t{k}*0.5;
        elseif MomPF.L_sum4t==0 & MomPF.U_sum4t==0
            CalcOutcome=0          
        end
   end

表:

【问题讨论】:

  • 你有什么问题?
  • @excaza,见上文(目标部分)
  • 一个问题通常以问号结尾。 (请不要添加“我如何实现该目标?”。This 可能会有所帮助。)
  • 您的代码不能正常工作有什么原因吗?你只需要CalcOutcome(k)=...吗?
  • @AnderBiguri 没错,目的是获得 CalcOutcome (554x1)。到目前为止,CalcOutcome 只返回零。如果单独运行,if 语句calculations 似乎都有效;问题在于将这两个链接起来并最终将计算结果存储在 CalcOutcome 变量中。

标签: matlab loops if-statement indexing financial


【解决方案1】:

正如其他人所提到的,索引似乎是问题所在。也就是说,您不需要循环——您应该能够通过表索引一次完成所有这些操作。例如,类似:

idx = (MomPF.L_sum4t < 0) & (MomPF.U_sum4t > 0); CalcOutcome(idx) = -0.5*MomPF.L_sum4t(idx) + 0.5*MomPF.U_sum4t(idx);

然后冲洗并重复其他条件。

【讨论】:

  • 非常感谢!在重复其他情况后,完全按照我的意图做。
【解决方案2】:

我没有要测试的数据,但我想说你忘了索引!

CalcOutcome = zeros(554,1);
  for k=height(MomPF)
        if MomPF.L_sum4t(k)<0 & MomPF.U_sum4t(k)>0           
            % make calc for every row but end result should only be 1 column
            % with the calc outcomes
            CalcOutcome(k)=(-1)*MomPF.L_sum4t(k)*0.5 + MomPF.U_sum4t(k)*0.5;

        elseif MomPF.L_sum4t(k)<0 & MomPF.U_sum4t(k)<0
            CalcOutcome(k)=(-1)*MomPF.L_sum4t(k)*1;

        elseif MomPF.L_sum4t(k)>0 & MomPF.U_sum4t(k)>0
            CalcOutcome(k)=MomPF.U_sum4t(k)*1;

        elseif MomPF.L_sum4t>(k)0 & MomPF.U_sum4t(k)<0
            CalcOutcome(k)=MomPF.L_sum4t(k)*0.5 + (-1)*MomPF.U_sum4t(k)*0.5;

        elseif MomPF.L_sum4t(k)==0 & MomPF.U_sum4t(k)==0
            CalcOutcome(k)=0          
        end
   end

你正在循环通过k,使用它。

【讨论】:

  • 这是我首先尝试的,但是出现了以下错误,所以我在if语句Cell contents reference from a non-cell array object. Error in matlab.internal.table.numArgumentsFromSubscriptRecurser (line 7) n = numArgumentsFromSubscript(a, s, ctxt); Error in tabular/numArgumentsFromSubscript (line 61) sz = matlab.internal.table.numArgumentsFromSubscriptRecurser(x,s(2:end),context);中删除了{k}
  • 根据您提供的屏幕截图,MomPF.L_sum4t 不是单元格,因此您无法使用花括号对其内容进行索引。您想要常规大括号:MomPF.L_sum4t(k).
  • @John ..........这与您所要求的完全不同。因为{k}->(k)。尝试当前的编辑。为了将来参考,请花时间阅读How to Ask,非常重要的是,minimal reproducible example
  • @AnderBiguri 仍然返回零,但 CKT 的方法似乎工作得很好。但是感谢您的时间和精力
  • @John 如果它仍然返回零,那么很可能您的逻辑是错误的,并且在将其重写为 CKT 方法的过程中,您修复了逻辑语句。将来我会建议使用调试器来确保您的条件实际上是正确制定的​​。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 2019-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多