package bot4cj.math import std.collection.* /* -------- 张量 -------- * INFO(20260524-qing): 输入一个维度列表 */ class Tensor { private let data: Array private let dims: Array private let size: Int64 public init(dims: Array, val: T) { var size = 1 for (item in dims) { /* ---- 计算总量 ---- */ size *= item } this.data = Array(size, {_ => val}) this.dims = dims this.size = size } /* -------- 私有构造函数,用于内部创建张量 -------- */ private init(dims: Array, data: Array) { this.dims = dims this.data = data var size = 1 for (item in dims) { size *= item } this.size = size } /* -------- 获取维度列表(形状) -------- */ public func shape(): Array { return dims } /* -------- 逐元素进行某种运算 -------- */ public func oneByOne(S: Tensor, f: (T, T) -> T): Tensor { let s1 = S.shape() /* ---- 比较维度数量 ---- */ if (s1 != dims) { throw IllegalArgumentException("Tensors' shape are not same") } /* ---- 比较维度形状 ----*/ for (i in 0..dims.size) { if (s1[i] != dims[i]) { throw IllegalArgumentException("Tensors' shape are not same") } } /* ---- 逐个进行计算 ---- */ let res_data = Array(size, {i => f(data[i], S.data[i])}) return Tensor(dims, res_data) } }