为什么在Scala Breeze中调用此3x2双倍矩阵的平均值是非法的?

为什么在Scala Breeze中调用此3x2双倍矩阵的平均值是非法的?,scala,scalala,Scala,Scalala,我是Breeze(以前叫Scalala)的新手,不明白为什么下面的简单程序会抛出异常。我使用的是Scala 2.9.2和Breeze 0.1: import breeze.linalg._ val m = DenseMatrix((3.0, 1.0, 2.0), (-2.0, 1.0, 3.0)) val n = mean(m, Axis._1) 如果我使用2x2或3x2矩阵,它会按预期工作,但2x3矩阵会导致以下异常: -- org.jblas ERROR Couldn't load cop

我是Breeze(以前叫Scalala)的新手,不明白为什么下面的简单程序会抛出异常。我使用的是Scala 2.9.2和Breeze 0.1:

import breeze.linalg._
val m = DenseMatrix((3.0, 1.0, 2.0), (-2.0, 1.0, 3.0))
val n = mean(m, Axis._1)
如果我使用2x2或3x2矩阵,它会按预期工作,但2x3矩阵会导致以下异常:

-- org.jblas ERROR Couldn't load copied link file: java.lang.UnsatisfiedLinkError: C:\Users\daved\AppData\Local\Temp\jblas8588491482847885553jblas.dll: Can't find dependent libraries.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6
    at breeze.linalg.package$$anon$1.apply$mcD$sp(package.scala:203)
    at breeze.linalg.package$$anon$1.apply(package.scala:196)
    at breeze.linalg.package$$anon$1.apply(package.scala:186)
    at breeze.linalg.DenseVector.ureduce(DenseVector.scala:91)
    at breeze.linalg.Tensor$$anon$1.apply(Tensor.scala:149)
    at breeze.generic.UReduceable$class.apply$mcD$sp(URFunc.scala:56)
    at breeze.linalg.Tensor$$anon$1.apply$mcD$sp(Tensor.scala:148)
    at breeze.generic.URFunc$mcD$sp$class.apply$mcD$sp(URFunc.scala:32)
    at breeze.linalg.package$$anon$1.apply$mcD$sp(package.scala:186)
    at breeze.generic.URFunc$mcD$sp$$anonfun$apply$mcD$sp$1.apply(URFunc.scala:36)
    at breeze.linalg.LowPriorityDenseMatrix1$$anon$17.apply(DenseMatrix.scala:444)
    at breeze.linalg.LowPriorityDenseMatrix1$$anon$17.apply(DenseMatrix.scala:440)
    at breeze.generic.URFunc$mcD$sp$class.apply$mcD$sp(URFunc.scala:36)
    at breeze.linalg.package$$anon$1.apply$mcD$sp(package.scala:186)
    at com.tennisedge.opencv.BreezePlay$delayedInit$body.apply(BreezePlay.scala:24)
这是构造函数中抛出异常问题的一个完美例子(参考)!伪装为依赖性问题的实际上是在按需类加载期间调用的构造函数中遇到的
ArrayIndexOutOfBoundsException
。这常常令人困惑。(这是我“最喜欢”(最臭名昭著)在构造函数中抛出异常的结果。)


至少在我看来是这样的。我不能确定,真的。

我相信这是一只微风中的虫子。特别是,
DenseMatrix
canCollapseCols
隐式转换

如果我在本地文件中定义了自己的隐式转换,则所有操作都会按预期进行:

implicit def myCanCollapseCols[V, R:ClassManifest] = new CanCollapseAxis[DenseMatrix[V], Axis._1.type, DenseVector[V], R, DenseVector[R]] {
  def apply(from: DenseMatrix[V], axis: Axis._1.type)(f: (DenseVector[V]) => R): DenseVector[R] = {
    val result = DenseVector.zeros[R](from.rows)
    val t = from.t
    for(r <- 0 until t.cols) { // BUG WAS HERE: was from.cols in original defintion.
      result(r) = f(t(::, r))
    }
    result
  }
}

val m = breeze.linalg.DenseMatrix((3.0, 1.0, 2.0), (-2.0, 1.0, 3.0))
val n = breeze.linalg.mean(m, breeze.linalg.Axis._1)
implicit def myCanCollapseCols[V,R:ClassManifest]=新的CanCollapseAxis[DenseMatrix[V],Axis.\u 1.type,DenseVector[V],R,DenseVector[R]]{
def应用(从:密度矩阵[V],轴:轴1.类型)(f:(密度向量[V])=>R):密度向量[R]={
val result=DenseVector.zeros[R](来自.rows)
val t=from.t

对于(r),请在文档中说明您的输入在哪里是合法的,在此之前,这是您代码中的一个bug,而不是Breeze的。请参阅scaladoc for Breeze at,它表示
mean
URFunc
。由于DenseMatrix[Double]是可还原的,因此调用它应该是合法的。如果这是我代码中的bug,我将问题改为“哪些矩阵可以合法调用
mean
on”因此变量m是有效的实例化对象,问题在3行(mean)-对吗?这对我使用SBT在osx上工作很好。这听起来像是你有依赖性问题,因为它找不到jblas,或者至少它无法访问它。是的,这是我的猜测,但当我读到它正在处理一些其他维度时…-不确定…即使问题基于Scala 2.9.2和Breeze 0,你认为你的答案有效吗.1?@xhudik:我对Breeze/Scalala一无所知(我听说过这个老名字),但我认为我的答案并不针对Scala版本或特定的第三方库(本机或其他)有问题。@Kirk:类加载通常是由构造函数调用触发的,对吗?嗯,很奇怪。这个编辑似乎与另一个编辑混淆了。我会还原它