225225length (a:: AbstractBlockedUnitRange ) = isempty (blocklasts (a)) ? zero (eltype (a)) : Integer (last (blocklasts (a))- first (a)+ oneunit (eltype (a)))
226226
227227"""
228+ blockisequal(a::AbstractArray, b::AbstractArray)
228229 blockisequal(a::AbstractUnitRange{<:Integer}, b::AbstractUnitRange{<:Integer})
229230
230- Check if `a` and `b` have the same block structure.
231+ Check if `a` and `b` have the same values (compared with `isequal`) and block structure.
232+
233+ See also blockequals and blockisapprox.
231234
232235# Examples
233236```jldoctest
@@ -251,6 +254,29 @@ true
251254
252255julia> blockisequal(b1, b2)
253256false
257+
258+ julia> A = reshape([1:6;], 2, 3)
259+ 2×3 Matrix{Int64}:
260+ 1 3 5
261+ 2 4 6
262+
263+ julia> B1 = BlockedMatrix(A, [1,1], [1,2])
264+ 2×2-blocked 2×3 BlockedMatrix{Int64}:
265+ 1 │ 3 5
266+ ───┼──────
267+ 2 │ 4 6
268+
269+ julia> B2 = BlockedMatrix(A, [1,1], [2,1])
270+ 2×2-blocked 2×3 BlockedMatrix{Int64}:
271+ 1 3 │ 5
272+ ──────┼───
273+ 2 4 │ 6
274+
275+ julia> blockisequal(B1, B1)
276+ true
277+
278+ julia> blockisequal(B1, B2)
279+ false
254280```
255281"""
256282blockisequal (a:: AbstractUnitRange{<:Integer} , b:: AbstractUnitRange{<:Integer} ) = first (a) == first (b) && blocklasts (a) == blocklasts (b)
@@ -265,6 +291,92 @@ blockisequal(::Tuple{}, ::Tuple{}) = true
265291blockisequal (:: Tuple , :: Tuple{} ) = false
266292blockisequal (:: Tuple{} , :: Tuple ) = false
267293
294+ blockisequal (a:: AbstractArray , b:: AbstractArray ) =
295+ blockisequal (axes (a), axes (b)) && isequal (a, b)
296+
297+ """
298+ blockequals(a::AbstractArray, b::AbstractArray)
299+
300+ Check if `a` and `b` have the same values (compared with `==`) and block structure.
301+
302+ See also blockisequal and blockisapprox.
303+
304+ # Examples
305+ ```jldoctest
306+ julia> A = reshape([1:6;], 2, 3)
307+ 2×3 Matrix{Int64}:
308+ 1 3 5
309+ 2 4 6
310+
311+ julia> B1 = BlockedMatrix(A, [1,1], [1,2])
312+ 2×2-blocked 2×3 BlockedMatrix{Int64}:
313+ 1 │ 3 5
314+ ───┼──────
315+ 2 │ 4 6
316+
317+ julia> B2 = BlockedMatrix(A, [1,1], [2,1])
318+ 2×2-blocked 2×3 BlockedMatrix{Int64}:
319+ 1 3 │ 5
320+ ──────┼───
321+ 2 4 │ 6
322+
323+ julia> blockequals(B1, B1)
324+ true
325+
326+ julia> blockequals(B1, B2)
327+ false
328+ ```
329+ """
330+ blockequals (a:: AbstractArray , b:: AbstractArray ) =
331+ blockisequal (axes (a), axes (b)) && (a == b)
332+
333+ """
334+ blockisapprox(a::AbstractArray, b::AbstractArray; kwargs...)
335+
336+ Check if `a` and `b` have the same block structure and approximately the same
337+ values, compared with `isapprox`. Accepts the same keyword arguments as `isapprox`.
338+
339+ See also blockisequal and blockequals.
340+
341+ # Examples
342+ ```jldoctest
343+ julia> A1 = reshape([1:6;], 2, 3)
344+ 2×3 Matrix{Int64}:
345+ 1 3 5
346+ 2 4 6
347+
348+ julia> A2 = A1 .+ 1e-5
349+ 2×3 Matrix{Float64}:
350+ 1.00001 3.00001 5.00001
351+ 2.00001 4.00001 6.00001
352+
353+ julia> B1 = BlockedMatrix(A1, [1,1], [1,2])
354+ 2×2-blocked 2×3 BlockedMatrix{Int64}:
355+ 1 │ 3 5
356+ ───┼──────
357+ 2 │ 4 6
358+
359+ julia> B2 = BlockedMatrix(A2, [1,1], [1,2])
360+ 2×2-blocked 2×3 BlockedMatrix{Float64}:
361+ 1.00001 │ 3.00001 5.00001
362+ ─────────┼──────────────────
363+ 2.00001 │ 4.00001 6.00001
364+
365+ julia> B3 = BlockedMatrix(A2, [1,1], [2,1])
366+ 2×2-blocked 2×3 BlockedMatrix{Float64}:
367+ 1.00001 3.00001 │ 5.00001
368+ ──────────────────┼─────────
369+ 2.00001 4.00001 │ 6.00001
370+
371+ julia> blockisapprox(B1, B2; atol=1e-4)
372+ true
373+
374+ julia> blockisapprox(B1, B3; atol=1e-4)
375+ false
376+ ```
377+ """
378+ blockisapprox (a:: AbstractArray , b:: AbstractArray ; kwargs... ) =
379+ blockisequal (axes (a), axes (b)) && isapprox (a, b; kwargs... )
268380
269381_shift_blocklengths (:: AbstractBlockedUnitRange , bl, f) = bl
270382_shift_blocklengths (:: Any , bl, f) = bl .+ (f - 1 )
0 commit comments