Wolfram mathematica mathematica中的循环结构

Wolfram mathematica mathematica中的循环结构,wolfram-mathematica,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

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

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}]}]  
[7]中的
=导入[“testA.txt”、“表”、“标题行”->1]
Out[7]={{100201020010,8,30},{11020102010,4,30,2010,9,
12}, {112, 2010, 8, 20, 2010, 10, 28}}
[10]=对于[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]],日期差[{a,b,c},{d,e,f}]

是。For[]不生成输出。你想要计算的差异是经过计算的(191、135和69),结果没有写入或存储在任何地方。为了说明这一点,将DateDifference[]调用重写为
Print[DateDifference[{a,b,c},{d,e,f}]

没有任何关于你想要发生什么的暗示。不清楚如何提供更多的建议。你可以播种,也可以收获。您可以将[]日期差异[]的结果加入结果列表。您可以打印差异(如上所述)。您可以将结果分配给某些变量,定义一个符号以获取其特定输入的值,et c.,et c.,et c

--编辑--

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

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 foo=Import[“testA.txt”,“Table”,“headerline”->1]; diff[in_List]:=Join[in[[Range[2,7]],{DateDifference[in[[Range[2,4]],[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}
(您可能也希望将其分配到某个地方)。

由于您似乎希望单独处理每个列表元素,我将使用(或其缩写形式
/
)来实现这一点,如下所示

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的结构,但通常最好从函数操作和转换表达式的角度来考虑。通常,如果您需要像这样的程序性过程,则最好选择

我的代码有一个小小的缺点,缺少命名变量有时会令人痛苦。然而,在这种情况下,它们不是必需的。但是,如果您需要它们,可以使用、甚至

警告:这不是我们要走的路 这是您的程序已更正并正在运行。我之所以发布它,是因为我在您的代码中看到了可能的概念性错误,我认为有一个运行版本可以将其与您的代码进行比较,这可能有助于您识别这些错误并进行学习

有几点:

  • 常用结构的使用(Length@x,i++,等等)
  • 不要使用“Out[n]=”。。。切勿将大写字母用作变量名的第一个字符
  • 了解如何构造列表(请参见附录)
下面是一个运行代码:

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  

你误读了他的密码,我最初也误读了。他的目的是返回原始数据,并附加
DateDifference
。所以,他用大括号把所有东西都包装起来,使之成为一个
列表。天真,是的,但很有效。当然,除了他没有发表声明之外。现在,如果他只对日期差异感兴趣,那么你是绝对正确的。但是,他前面的问题提出了相反的建议。或者更正确地说,迭代器应该是
{i,Length@x}
)是的,范围[]s可以替换为较短的语法。但是,将代码转换为行干扰并不能提高可读性。Span语法在这里很有用:
Join[in[[2;;7]]、{DateDifference[in[[2;;4]]、in[[5;;7]}
@Joshua Martell:我建议阅读我在你之前发表的评论。虽然我原则上同意关于线路噪音的看法,但我不认为
Span
对噪音的影响太大。在大多数情况下,[[2;;4]
中的
与[[2,4]]中的
一样清晰
因为
2;;4
可以被解读为2到4。在有些情况下,它会更难解读,比如等价的
2;;-4
,但在这里就可以了。
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}]