- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想对数据集运行一系列转换。这些转换的输入和输出在类型方面总是相同的,所以我可以任意选择一个顺序。最后,我想评估不同订单的执行情况(输出数据的质量、计算性能等)。所以我给程序一个文件,其中每一行都包含一个函数标识符,然后我这样运行它:
// read lines of file into plan
for (x <- plan) {
val temp : myDataType
x match {
case "Func_A" => temp = myData.map(y => funcA(y))
case "Func_B" => temp = myData.map(y => funcB(y))
...
}
myData = temp
}
myDataType
是一个不可变 集合,它迫使我使用这些临时变量。 plan
可能包含 20 行/函数标识符,这将导致大量复制操作。所以我正在寻找更好的解决方案。我的梦想是像这样链接所有的 map
函数,其中 write
只是一个收集统计数据并将它们写入磁盘的函数,不需要临时变量:
plan match {
case "Plan_A" => myData.map(x => funcB(x)).map(x => funcA(x)).map(...).write
case "Plan_B" => myData.map(x => funcA(x)).map(...).map(x => funcA(x)).write
...
}
但是,在这种情况下,我需要提前知道所有(至少是我想尝试的)排列,并且会有很多(20 多个函数)。我还研究了编译时/运行时代码生成,但对我来说它看起来有点矫枉过正。
所以也许您有一些想法可以更优雅地解决这个问题。
最佳答案
我认为这里有两件事需要解决。
注意:为简单起见,我假设对 Int
进行操作,因此函数类型为 Int => Int
。你说你正在映射到相同的类型。
假设您有一系列函数和一些数据,您可以执行以下操作:
...
val plan: Seq[Int => Int] = ... // see my second point
...
val myData = List(1, 2, 3, 4) // immutable List
// Can use compose instead of andThen
val compositeFunc = plan.foldLeft((i: Int) => i)(_ andThen _)
val newData = myData map compositeFunc
请注意,您可以使用 andThen
或 compose
( https://twitter.github.io/scala_school/pattern-matching-and-functional-composition.html ) 组合函数
您可以通过多种方式执行此操作:
map 中的静态定义
class MyFunctions {
def f1(i: Int): Int = i * 2
def f2(i: Int): Int = i * i
def f3(i: Int): Int = i * i * i
// Hardcoded map from string to function name
// Avoids any reflection
val funMap = Map[String, (Int) => Int](
"f1" -> f1,
"f2" -> f2,
"f3" -> f3
)
}
val funcs = new MyFunctions
val myData = List(1, 2, 3, 4) // immutable List
// Assume you read these from your file
val planFromFile = List("f1", "f3", "f2") // String function names
// Get functions using the hardcoded map
val plan = planFromFile map (name => funcs.funMap(name))
// Can use compose instead of andThen
val compositeFunc = plan.foldLeft((i: Int) => i)(_ andThen _)
// Map the function composition to your data
val newData = myData map compositeFunc
使用反射
import scala.reflect.runtime.{universe => ru}
class MyFunctions {
def f1(i: Int): Int = i * 2
def f2(i: Int): Int = i * i
def f3(i: Int): Int = i * i * i
}
val funcs = new MyFunctions
val myData = List(1, 2, 3, 4) // immutable List
// Assume you read these from your file
val planFromFile = List("f1", "f3", "f2") // String function names
// Acts as a function wrapper that wraps a MethodMirror
// Note that all functions in Scala are objects ((Int => Int) is shorthand for Function1 ...)
class WrappedFunction(mirror: reflect.runtime.universe.MethodMirror) extends (Int => Int) {
override def apply(v1: Int): Int = mirror(v1).asInstanceOf[Int]
}
// Returns function wrappers for each string
// Note for simplicity there is no code dealing with missing function , errors etc.
def getFunctions(names: Seq[String]): Seq[Int => Int] =
names.map(s => new WrappedFunction(ru.runtimeMirror(funcs.getClass.getClassLoader)
.reflect(funcs)
.reflectMethod(ru.typeOf[MyFunctions]
.decl(ru.TermName(s)).asMethod)))
val reflectedFunctions = getFunctions(planFromFile)
// Compose them from the generated functions
val compositeFunc2 = reflectedFunctions.foldLeft((i: Int) => i)(_ andThen _)
// Generate data
val newData2 = myData map compositeFunc2
我没有谈到在运行时编译,我假设这不是您的用例。
您还可以组合这些方法并使用反射生成 map 。
编辑 显然你也可以使用模式匹配而不是那个映射..像这样:
def fromName(name: String): Int => Int = name match {
case "f1" => f1
case "f2" => f2
case "f3" => f3
case _ => throw new IllegalArgumentException("booooom!")
}
有关反射的更多信息,请参阅文档:http://docs.scala-lang.org/overviews/reflection/overview.html
关于algorithm - 置换函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36718437/
我正在尝试获取 vector 的每个排列,但也有一个指示子排列的分隔符。从我的结果中可以看出,我的代码似乎有一个错误,即结束排列。 0 1 3 2 | 和 0 2 3 1 | 和 0 3 2 1 |
假设我有整数数组列表...有没有一种方法可以生成数组列表中元素的随机排列/排列 所以如果列表是 {1,2,3,4,5,6} 调用一些方法 randomPermute() 会把它变成随机的东西,比如 {
为什么此代码注释有效(代码编译并运行良好,但实际上并未显示排列): int main(int argc, char *argv[]) { long number; vector int
我正在开发一个模块化 Maven 项目。我的项目的框架如下: |-- parent |-- model --pom.xml |-- services -
随机(但重复)置换 Java 字节数组中所有位的最快方法是什么?我试过用 BitSet 成功地做到了,但是有更快的方法吗?显然,for 循环消耗了大部分 CPU 时间。 我刚刚在我的 IDE 中做了一
假设我有一个 int T 数组,我正在寻找一种置换 i 和 T[i] 的就地算法 我有:[3 2 0 1] (a) 我想要:[2 3 1 0] (b) 例如。在 (b) 中 T[0] = 2 因为在
我有以下问题: 在 __m128i寄存器有 16 个 8 位值,按以下顺序排列: [ 1, 5, 9, 13 ] [ 2, 6, 10, 14] [3, 7, 11, 15] [4, 8, 12,
是否可以使用 Cg 修改片段(像素)着色器中的像素坐标?我确信此类功能在第二代/第三代着色器中可用,但我不知 Prop 体的配置文件是什么,也不知道如何使用。 最佳答案 不,这是不可能的。 您可以在片
是否可以使用 Cg 修改片段(像素)着色器中的像素坐标?我确信此类功能在第二代/第三代着色器中可用,但我不知 Prop 体的配置文件是什么,也不知道如何使用。 最佳答案 不,这是不可能的。 您可以在片
我有一个 arma::cube mycube(5,10,15); 我想排列它的尺寸,就像在 matlab 中做的那样: mycube = ones(5,10,15); mycube = permute
假设 100 人围成一圈。从第 1 人数到第 14 人,将此人移出圈子。按照数数顺序,再次数数,去掉第 14 个人。重复。最后站着的是谁? 我已经尝试了一切来解决这个问题,但它似乎无法处理死循环。
我对使用 C 代码置换 d 维张量的元素很感兴趣(因此,只使用循环),我想用 d 作为参数编写函数。张量数据目前包含在“d 维”指针中(例如,当 d = 1 时的简单数组)。到目前为止,我已经用 **
我正在尝试为网站上的图像创建 rgb 偏移效果。我有基本的功能,但问题是 channel 被纹理的 uv 偏移了。因此,如果图像大小不同,则每个图像的偏移量在视觉上并不相同。 这是我的片段着色器。 u
我正在开发一个由 SQLite 数据库支持的 C++ 程序。该数据库包含文档表、文档元素和文档边界(即位于文档边界上的文档元素集)。文档是在运行时创建的。 该程序支持合并文档的基本操作,它使用源文档中
假设您有一个 std::vector某种类型的T和一系列指数 std::vector这个 vector 。现在我正在寻找一个函数 permute(const std::vector& vector,
我正在尝试用 替换我的表结构标签。但是前导订单号和内容之间总是存在位移/偏移。 A Name An Icon 我不知道要更改什么。当我使用
这个问题与这个question有关可能到this other 假设您有两个矩阵 A 和 B。A 是 M×N,B 是 N×K。我想获得一个 M×K 矩阵 C 使得 C(i, j) = 1 - prod(
我是一名优秀的程序员,十分优秀!