Breeze库新手求助:将(2,1,40)形状3D数组转为指定Dense矩阵
解决Breeze库中3D数组转稠密矩阵的问题
嘿,刚接触Breeze是吧?我来帮你理清楚这个问题~
首先得指出你当前代码的问题:你写的这段代码会直接报错,因为Breeze的DenseMatrix构造函数要求传入的数据数组长度必须严格等于行数 × 列数。你这里指定了2行1列,所以数据数组长度应该是2,但你传了40个元素,两者不匹配,肯定跑不起来。
接下来看你的需求:你想要生成一个2行1列的矩阵,每一行包含40个0.0值。这里我分两种常见的理解给你对应解决方案:
情况1:矩阵每个元素是包含40个0.0f的数组
如果你的意思是2行1列的矩阵,每个单元格里存一个长度为40的全0 Float数组(也就是矩阵元素类型是Array[Float]),可以用tabulate方法来构造:
import breeze.linalg._ val rows = 2 val cols = 1 val elemLength = 40 // 遍历矩阵的每个位置,为每个位置生成40个0.0f的数组 val matrix = DenseMatrix.tabulate[Array[Float]](rows, cols) { (_, _) => Array.fill(elemLength)(0.0f) }
要是你已经有一个形状为(2,1,40)的3D数组,也可以直接把它转换成这种矩阵:
// 假设你的3D数组是这个结构 val original3DArray: Array[Array[Array[Float]]] = Array( Array(Array.fill(40)(0.0f)), Array(Array.fill(40)(0.0f)) ) // 直接转换为2行1列的矩阵,每个元素是长度40的数组 val matrix = DenseMatrix(original3DArray.map(_.map(_.clone())): _*)
情况2:实际想要2行40列的全0矩阵
如果是你表述有误,其实需要的是2行、每行40个0.0f的普通二维矩阵,那Breeze有更简洁的写法:
import breeze.linalg._ // 直接生成2行40列的全0 Float矩阵 val matrix = DenseMatrix.zeros[Float](2, 40)
要是你想用构造函数的方式实现,也可以这么写:
val matrix = new DenseMatrix[Float](2, 40, Array.fill(2*40)(0.0f))
这里数据数组长度是2×40=80,完全符合构造要求。
内容的提问来源于stack exchange,提问作者Rahul Kumar
相关产品推荐
相关产品推荐

