如何定义关联类型(如抽象矩阵与对应列类型)并简化结构体实现?
优化二元矩阵与列元素结构体的实现
核心优化思路
利用Julia的参数化构造函数与自动类型推导特性,消除重复样板代码,同时提升结构体的扩展性,适配更多布尔矩阵类型。
优化后的完整代码
import SparseArrays.AbstractSparseMatrix mutable struct SparseBinaryMatrix <: AbstractSparseMatrix{Bool,Int64} shape::Tuple{Int64,Int64} cols::Vector{Set{Int64}} SparseBinaryMatrix(cols::Vector{Set{Int64}}) = minimum(map(minimum, cols)) < 1 ? error("Specified an index less than 1.") : new((maximum(map(maximum, cols)), length(cols)), cols) end Base.size(A::SparseBinaryMatrix) = A.shape Base.getindex(A::SparseBinaryMatrix, i, j) = i in A.cols[j] # TODO: add bounds check Base.setindex!(A::SparseBinaryMatrix, v::Bool, i, j) = v ? push!(A.cols[j], i) : delete!(A.cols[j], i) Base.eachcol(A::SparseBinaryMatrix) = A.cols # 优化后的 Example 结构体 struct Example{T<:AbstractMatrix{Bool}, U} matrix::T vector::U end # 通用构造函数,自动推导类型参数 Example(matrix::T) where T<:AbstractMatrix{Bool} = Example(matrix, first(eachcol(matrix)))
优化点说明
- 类型约束增强安全性:给
Example的T参数添加AbstractMatrix{Bool}约束,确保只有布尔矩阵类型能被传入,避免无效类型的误用。 - 消除重复构造逻辑:通过通用构造函数自动调用
first(eachcol(matrix))获取第一列元素,Julia会根据该元素的类型自动推导U参数,无需为每种矩阵类型单独编写构造函数。 - 扩展性提升:后续新增任何实现了
eachcol方法的布尔矩阵类型(比如官方的SparseMatrixCSC{Bool}),都能直接适配Example结构体,无需修改现有代码。
测试验证
# 测试稀疏矩阵场景 sparse_cols = [Set([1,3]), Set([2])] sparse_mat = SparseBinaryMatrix(sparse_cols) example_sparse = Example(sparse_mat) # 类型为 Example{SparseBinaryMatrix, Set{Int64}},符合预期 # 测试稠密矩阵场景 dense_mat = Bool[1 0; 0 1; 1 0] example_dense = Example(dense_mat) # 类型为 Example{Matrix{Bool}, Vector{Bool}},符合预期
内容的提问来源于stack exchange,提问作者Joel Wallman
相关产品推荐
相关产品推荐

