将每个值分配为Scala中Array中的下一项

时间:2017-01-10 20:40:53

标签: arrays scala matrix

我是Scala的新手,无法在数组中迭代为Matrix分配值。我的编程背景主要是Python,所以我很难看到执行此任务的功能方式。

我有一个数组,.gitignore,我有一个空的3x3矩阵val averages = Array(1,2,3,4,5,6,7,8,9),由Scala库M制作。我需要从Array中获取值并将它们放入矩阵中。

通常,我会尝试类似的事情:

breeze

这不起作用,导致矩阵简单地填充&#34; 1&#34; s。我认为这是因为Scala在 var index = 0 for(i <- 0 until M.cols) for(j <- 0 until M.rows) M(i,j) = averages(index) index += 1 之前正在评估M(i,j) = averages(index)。我已尝试使用不同类型的index += 1循环来获得平均值,但无法获得我想要的结果:

for

我知道在Scala中使用Random集合可以执行此操作,并使用随机变量填充矩阵:

1 2 3
4 5 6
7 8 9 

但是看看Scala文档, val r = new scala.util.Random(0) for(i <- 0 until M.rows) for(j <- 0 until M.cols) M(i, j) = r.nextDouble() 没有Array方法。

无论如何,即使使用.next也是非常迭代的,而不是功能性解决方案。任何人都可以帮助我1)找出循环通过.next和/或2)的正确方法找出一个实用的方法吗?谢谢!

2 个答案:

答案 0 :(得分:2)

你确定你不只是有一个括号问题吗?您在上面提供的代码看起来应该是:

 var index = 0
 for(i <- 0 until M.cols)
    for(j <- 0 until M.rows) {
        M(i,j) = averages(index)
        index += 1
    }

如果您不包含这些大括号,则只会运行第二个for循环的第一行。 Java / Scala依靠这些大括号来组合事物。你不能像Python一样依赖缩进。 如果您不想使用索引参数,一些数学也可以使用:

for(i <- 0 until M.cols
    for(j <- 0 until M.rows) {
        M(i, j) = 1 + i + j * M.cols

答案 1 :(得分:2)

根据定义,将数据从一个现有集合复制到另一个集合,依赖于副作用来实现您的目标。更多的FP方法是直接从旧的方法构建一个新方法。

我没有安装Breeze,但根据scaladocs,这样的事情应该是可能的。

Matrix((0 until colLen).map(x => averages.slice(x*rowLen, (x+1)*rowLen)))