You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义关联类型(如抽象矩阵与对应列类型)并简化结构体实现?

优化二元矩阵与列元素结构体的实现

核心优化思路

利用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)))

优化点说明

  1. 类型约束增强安全性:给Example的T参数添加AbstractMatrix{Bool}约束,确保只有布尔矩阵类型能被传入,避免无效类型的误用。
  2. 消除重复构造逻辑:通过通用构造函数自动调用first(eachcol(matrix))获取第一列元素,Julia会根据该元素的类型自动推导U参数,无需为每种矩阵类型单独编写构造函数。
  3. 扩展性提升:后续新增任何实现了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:48:24