我是Scala的新手,无法在数组中迭代为Matrix分配值。我的编程背景主要是Python,所以我很难看到执行此任务的功能方式。
我有一个数组,.gitignore
,我有一个空的3x3矩阵val averages = Array(1,2,3,4,5,6,7,8,9)
,由Scala库M
制作。我需要从Array中获取值并将它们放入矩阵中。
通常,我会尝试类似的事情:
breeze
这不起作用,导致矩阵简单地填充" 1" 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)的正确方法找出一个实用的方法吗?谢谢!
答案 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)))