mathematica中的循环结构

时间:2010-11-03 04:46:58

标签: wolfram-mathematica

感谢您回答之前的问题,我做了以下操作,但我正在尝试执行此循环,但没有给出错误。我正在尝试做日期差异。

In[7] = Import["testA.txt", "Table" , "HeaderLines" -> 1]
Out[7] = {{100, 2010, 2, 20, 2010, 8, 30}, {110, 2010, 4, 30, 2010, 9, 
           12}, {112, 2010, 8, 20, 2010, 10, 28}}

In[10] =  For[i = 1, i < 4,   
          i = i + 1, {a = Out[7] [[i, 2]], b = Out[7] [[i, 3]],   
          c = Out[7] [[i, 4]] , d = Out[7][[i, 5]], e = Out[7][[i, 6]],   
          f = Out[7][[i, 7]], DateDifference[{a, b, c}, {d, e, f}]}]  

3 个答案:

答案 0 :(得分:3)

是。因为[]不生成输出。您想要计算机的差异被计算(191,135和69),并且结果不会被写入或存储在任何地方。为了明白这一点,请将DateDifference []调用重写为Print[DateDifference[{a,b,c},{d,e,f}]];

没有任何关于你想要发生什么的进一步暗示。目前尚不清楚如何提供更多建议。你可以播种[]和收割[]。您可以将[] DateDifference []的结果加入到结果列表中。您可以打印差异(如上所述)。您可以将结果分配给某些变量,定义符号以获取特定输入的值,等等,等等...

- 编辑 -

哦,为了解决其他一些受访者,此代码的正确形式为:

    foo = Import["testA.txt", "Table" , "HeaderLines" -> 1];
    diff[in_List] := Join[in[[Range[2, 7]]], {DateDifference[in[[Range[2, 4]]], in[[Range[5, 7]]]]}]
    diff /@ foo

输出为:{{2010, 2, 20, 2010, 8, 30, 191}, {2010, 4, 30, 2010, 9, 12, 135}, {2010, 8, 20, 2010, 10, 28, 69}}(你可能也希望在某处分配)。

答案 1 :(得分:3)

因为您似乎想要单独处理每个列表元素,所以我会使用Map(或其简称/@),如下所示。

In[1]:=data = {{100, 2010, 2, 20, 2010, 8, 30}, 
               {110, 2010, 4, 30, 2010, 9, 12}, 
               {112, 2010, 8, 20, 2010, 10, 28}};
       #~Join~{DateDifference[#[[2;;4]],#[[5;;]]]}& /@ data
Out[1]:={191, 135, 69}

Mathematica主要是一种函数式编程语言,因此虽然存在类似For的构造,但通常更好地考虑操作和转换表达式的函数。通常,如果您需要For这样的程序流程,Table是更好的选择。

我的代码有一个轻微的缺点,缺少命名变量有时会很痛苦。然而,在这种情况下,它们不是必需的。但是,如果您需要它们,可以使用几种结构WithBlockModule,甚至Function

答案 2 :(得分:3)

警告:这不是要走的路

这是您的程序已更正并正在运行。我发布它是因为我看到你的代码中可能存在概念错误,我认为有一个正在运行的版本可以帮助你识别和学习。

有些观点:

  • 使用常见结构(Length @ x,i ++等)
  • 不要使用“Out [n] =”...绝不使用大写字母作为变量名称的第一个字符
  • 了解如何构建列表(请参阅AppendTo)

这是一个正在运行的代码:

x = Import["testA.txt", "Table" , "HeaderLines" -> 1]

ret = {};
For[i = 1, i <= Length@x, i++,
  AppendTo[ret,
    {a = x[[i, 2]],
     b = x[[i, 3]],
     c = x[[i, 4]],
     d = x[[i, 5]],
     e = x[[i, 6]],
     f = x[[i, 7]],
     DateDifference[{a, b, c}, {d, e, f}]}
    ];
  ];
Print@ret  

但正如我所说,这不是走的路。阅读和学习(并在调试中运行!)rcollyer的答案是为了理解如何在Mathematica中正确地完成它。

BTW,您可以用表替换For循环(参见rcollyer的建议)

Table[
      {a = x[[i, 2]],
       b = x[[i, 3]],
       c = x[[i, 4]],
       d = x[[i, 5]],
       e = x[[i, 6]],
       f = x[[i, 7]],
       DateDifference[{a, b, c}, {d, e, f}]}, {i, Length@x}]