Wolfram mathematica 点列表上的函数映射
我有一份要点清单:Wolfram mathematica 点列表上的函数映射,wolfram-mathematica,Wolfram Mathematica,我有一份要点清单: points = {{0.144, 1.20}, {0.110, 1.60}, {0.083, 2.00}, {0.070, 2.40}, {0.060, 2.80}, {0.053, 3.20}, {0.050, 3.60}, {0.043, 4.00}} 我想将每个点传递到此函数,并返回一个新点: coordinate[length_,frequence_] = {(1/(2*length)) , (frequence*1000)} 这将产生如下列表
points = {{0.144, 1.20}, {0.110, 1.60}, {0.083, 2.00}, {0.070, 2.40},
{0.060, 2.80}, {0.053, 3.20}, {0.050, 3.60}, {0.043, 4.00}}
我想将每个点传递到此函数,并返回一个新点:
coordinate[length_,frequence_] = {(1/(2*length)) , (frequence*1000)}
这将产生如下列表:
{ {3.47, 12 000}, {4.54, 16 000}, ... }
我一直在尝试使用map:
data = Map[coordinate, points]
它产生如下结果:
{coordinate[{0.144, 1.2}], coordinate[{0.11, 1.6}]}
起初,这似乎是正确的,只是它传递了一个列表,而不仅仅是参数。但是,即使我将我的
坐标
函数更改为接受列表(通过将预期参数更改为列表
并将长度
更改为列表[[1]]
和频率
更改为列表[[2]
),我将无法使用该映射返回的列表,例如,通过LinearModelFit[data,x,x][“BestFit”]
将您的定义更改为
coordinate[point_] := {(1/(2*point[[1]])) , (point[[2]]*1000)}
将您的定义更改为
coordinate[point_] := {(1/(2*point[[1]])) , (point[[2]]*1000)}
及
及
旁注:我个人会远离其他答案中提出的@@@
,因为作为一名程序员,我觉得这很尴尬。但这些答案当然也是正确的
旁注:我个人会远离其他答案中提出的
@@@
,因为作为一名程序员,我觉得这很尴尬。但是这些答案当然也是有效的。或者,您可以使用Apply
而不是Map
:
coordinate @@@ points
输出:
{{3.47222, 1200.}, {4.54545, 1600.}, {6.0241, 2000.}, {7.14286, 2400.},
{8.33333, 2800.}, {9.43396, 3200.}, {10., 3600.}, {11.6279, 4000.}}
或者,您可以使用
Apply
而不是Map
:
coordinate @@@ points
输出:
{{3.47222, 1200.}, {4.54545, 1600.}, {6.0241, 2000.}, {7.14286, 2400.},
{8.33333, 2800.}, {9.43396, 3200.}, {10., 3600.}, {11.6279, 4000.}}
使用您的定义的最简单方法是在级别1上应用
,该级别的缩写为@@@@code>。(请参阅的更多信息部分。)那么,您想要
points = {{0.144, 1.20}, {0.110, 1.60}, {0.083, 2.00}, {0.070,
2.40}, {0.060, 2.80}, {0.053, 3.20}, {0.050, 3.60}, {0.043, 4.00}}
coordinate[length_, frequence_] := {(1/(2*length)), (frequence*1000)}
coordinate @@@ points
请注意,我已将您的定义更改为SetDelayed
,而不仅仅是Set
(请注意右侧显示本地化变量的语法突出显示)。请参阅指南页
这就是说,最好让坐标采用列表而不是顺序,就像belisarius和ninjagecko的答案那样,即
coordinate[{length_, frequence_}] := {(1/(2*length)), (frequence*1000)}
使用您的定义的最简单方法是在级别1上应用
,该级别的缩写为@@@@code>。(请参阅的更多信息部分。)那么,您想要
points = {{0.144, 1.20}, {0.110, 1.60}, {0.083, 2.00}, {0.070,
2.40}, {0.060, 2.80}, {0.053, 3.20}, {0.050, 3.60}, {0.043, 4.00}}
coordinate[length_, frequence_] := {(1/(2*length)), (frequence*1000)}
coordinate @@@ points
请注意,我已将您的定义更改为SetDelayed
,而不仅仅是Set
(请注意右侧显示本地化变量的语法突出显示)。请参阅指南页
这就是说,最好让坐标采用列表而不是顺序,就像belisarius和ninjagecko的答案那样,即
coordinate[{length_, frequence_}] := {(1/(2*length)), (frequence*1000)}
我觉得@@@
是处理这个问题最干净的方法。但是,如果您可以重新定义<代码>坐标< /代码>,但不想删除其现有语法,可以考虑这个构造。
Clear[coordinate]
coordinate[length_, frequence_] := {(2 length)^-1, 1000 frequence}
coordinate[l_List] := Apply[coordinate, l, {-2}]
新行添加了处理列表的定义。这假设您的参数本身不是具有深度的对象。它为您使用该功能提供了相当大的灵活性:
coordinate[0.144, 1.20]
(*Out= {3.47222, 1200.} *)
coordinate[{0.144, 1.20}]
(*Out= {3.47222, 1200.} *)
coordinate[points]
(*Out= {{3.47222, 1200.}, {4.54545, 1600.}, {6.0241,
2000.}, {7.14286, 2400.}, {8.33333, 2800.}, {9.43396, 3200.}, {10.,
3600.}, {11.6279, 4000.}} *)
coordinate /@ points
(*Out= {{3.47222, 1200.}, {4.54545, 1600.}, {6.0241,
2000.}, {7.14286, 2400.}, {8.33333, 2800.}, {9.43396, 3200.}, {10.,
3600.}, {11.6279, 4000.}} *)
coordinate @@@ points
(*Out= {{3.47222, 1200.}, {4.54545, 1600.}, {6.0241,
2000.}, {7.14286, 2400.}, {8.33333, 2800.}, {9.43396, 3200.}, {10.,
3600.}, {11.6279, 4000.}} *)
我觉得@@@
是处理这个问题最干净的方法。但是,如果您可以重新定义<代码>坐标< /代码>,但不想删除其现有语法,可以考虑这个构造。
Clear[coordinate]
coordinate[length_, frequence_] := {(2 length)^-1, 1000 frequence}
coordinate[l_List] := Apply[coordinate, l, {-2}]
新行添加了处理列表的定义。这假设您的参数本身不是具有深度的对象。它为您使用该功能提供了相当大的灵活性:
coordinate[0.144, 1.20]
(*Out= {3.47222, 1200.} *)
coordinate[{0.144, 1.20}]
(*Out= {3.47222, 1200.} *)
coordinate[points]
(*Out= {{3.47222, 1200.}, {4.54545, 1600.}, {6.0241,
2000.}, {7.14286, 2400.}, {8.33333, 2800.}, {9.43396, 3200.}, {10.,
3600.}, {11.6279, 4000.}} *)
coordinate /@ points
(*Out= {{3.47222, 1200.}, {4.54545, 1600.}, {6.0241,
2000.}, {7.14286, 2400.}, {8.33333, 2800.}, {9.43396, 3200.}, {10.,
3600.}, {11.6279, 4000.}} *)
coordinate @@@ points
(*Out= {{3.47222, 1200.}, {4.54545, 1600.}, {6.0241,
2000.}, {7.14286, 2400.}, {8.33333, 2800.}, {9.43396, 3200.}, {10.,
3600.}, {11.6279, 4000.}} *)
为了记录在案,英语中的单词是frequency
frequency
在技术上是可以接受的,但我认为从来没有在唱片上使用过,在英语中,单词是frequency
<代码>频率
在技术上是可以接受的,但我认为从来没有使用过doops,我输入了一个错别字,没有做过:=
。这就是你想要的,因为[
..]
里面的任何东西都可以是一个模式,例如坐标[pattern]
。哎呀,我打错了,没有做:=
。这就是你想要的,因为[
..
]
里面的任何东西都可以是一种模式,例如坐标[pattern]
。我个人更喜欢应用[…,1]
方法——我认为它使代码更容易读/写。(出于某种原因,我不喜欢使用零件
,除非我绝对必须……@Brett我同意你对美学的看法,但有时出于性能考虑,我会选择基于零件
。对于大型列表,使用Apply
通常会阻止自动编译。如果我们用模式定义coordinate
,这并不重要,但是如果我们使用纯函数,比如coordinate={{2,{2*1000}&
forApply[…,1]
和coordinatePart={[1]/2,{[2]]*1000}&
forMap
。使用测试样本,如pointsFreqs=RandomReal[{1,10},{100000,2}]您可以观察到自动编译Map
比Apply
具有显著的性能优势@Brett:我同意,使用Part
看起来很难看,使代码更难阅读:“变量列表[[2]]
指的是什么?”。(编辑:虽然Leonid确实提出了一个很好的观点!)感谢您对Apply/Map和Set/SetDelayed参考的详细回答。就个人而言,我更喜欢Apply[…,1]
方法——我认为它使代码更易于阅读/编写。(出于某种原因,我不喜欢使用零件
,除非我绝对必须……@Brett我同意你对美学的看法,但有时出于性能考虑,我会选择基于零件
。对于大型列表,使用Apply
通常会阻止自动编译。如果我们用模式定义coordinate
,这并不重要,但是如果我们使用纯函数,比如coordinate={{2,{2*1000}&
forApply[…,1]
和coordinatePart={[1]/2,{[2]]*1000}&
forMap
。使用测试