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}]