我正在玩incanter,因为我正在学习clojure,当我尝试在lein下的REPL中创建矩阵时,我不断收到错误消息:
user=> (use 'incanter.io)
nil
user=> (use 'incanter.core)
nil
user=> (def A (matrix [[1 2 3] [4 5 6] [7 8 9]]))
NoSuchMethodError edu.emory.mathcs.utils.ConcurrencyUtils.getThreads
BeginN_2D()Icern.colt.matrix.tdouble.impl.DenseColumnDoubleMatrix2D.assign (DenseColumnDoubleMatrix2D.java:661)
它看起来像是一个依赖问题,但还不确定如何解决这个问题。
答案 0 :(得分:1)
使用[org.clojure / clojure“1.4.0”]和[incanter“1.4.1”]来解决同样的问题。 Def有一个类路径阴影感。
在repl中做了以下事情来确定ConcurrencyUtils来自哪个jar:
(.getResource edu.emory.mathcs.utils.ConcurrencyUtils
"/edu/emory/mathcs/utils/ConcurrencyUtils.class")
这指向了jplasma。果然,jplasma有自己的那个类副本,它有各种方法,包括缺少getThreadsBeginN_2D。
看着deps(“lein pom”后面跟着“mvn dependency:tree”)表明这是一个由incanter 1.4.1引入的依赖:
[INFO] | +- incanter:incanter-core:jar:1.4.1:compile
[INFO] | | +- org.clojure:math.combinatorics:jar:0.0.3:compile
[INFO] | | \- net.sourceforge.parallelcolt:parallelcolt:jar:0.10.0:compile
[INFO] | | +- net.sourceforge.jplasma:jplasma:jar:1.2.0:compile
更改了project.clj中incanter的条目以排除jplasma:
[incanter "1.4.1"
:exclusions [net.sourceforge.jplasma/jplasma]]
这从jtransforms获取ConcurrencyUtils(因此仍然不是来自parallelcolt),但至少解决了矩阵问题:
=> (matrix [[1 2 3] [4 5 6] [7 8 9]])
[1.0000 2.0000 3.0000
4.0000 5.0000 6.0000
7.0000 8.0000 9.0000]
不确定排除的影响是什么。在clojars上有一个旧版本的jplasma,它不会破坏矩阵,你可以尝试将它添加到你的project.clj:
[incanter/jplasma "0.9.4"]
这些代表显然需要由了解它们的人正确分类。