Mathematica:导入Excel的列表参数在分段函数中失效求助
问题解决方法
核心原因
你的b、e、q、w均为列表型数据,但Piecewise默认仅对单个表达式做条件判断,不会自动对列表执行逐元素映射计算,因此输出不符合预期的0/1列表格式。
修正方案
方案1:逐元素映射处理
借助MapThread(或简化写法& @@@)将判断逻辑应用到每个元素对:
q1N = (e + w)/(e + b); FeasR = Piecewise[{{1, # <= #2}, {0, #2 < #}}] & @@@ Transpose[{q1N, q}]
Transpose[{q1N, q}]会把两个列表配对为{{q1N₁, q₁}, {q1N₂, q₂}, ...}的结构& @@@将每个元素对传入匿名函数,逐个执行Piecewise条件判断
方案2:布尔表达式转数值(更简洁)
Mathematica中True等价于1、False等价于0,可直接用条件表达式生成数值列表:
q1N = (e + w)/(e + b); FeasR = If[# <= #2, 1, 0] & @@@ Transpose[{q1N, q}] // 更简洁的写法:利用UnitStep函数 FeasR = 1 - UnitStep[q - q1N]
UnitStep[x]在x>0时返回1,x≤0时返回0,1 - UnitStep[q - q1N]完全匹配你需要的判断逻辑:q1N ≤ q时返回1,否则返回0。
方案3:验证导入数据格式
先确认数据维度是否正确,避免因切片错误导致列表运算异常:
(* 检查MainData的维度 *) Dimensions[MainData] (* 验证各变量长度是否一致(应为1000) *) Length[b] == Length[w] == Length[e] == Length[q] == 1000
若维度不符,需调整InData[[2 ;; 1001, 2 ;; 7]]的切片范围。
结果调整
执行修正代码后,FeasR会输出{1, 0, 1, 1, 0, ...}的一维列表,若需要{{1,0,1,...}}的二维格式,用{FeasR}包裹即可。
内容的提问来源于stack exchange,提问作者Hossein Reihani
相关产品推荐
相关产品推荐

