225
225
length (a:: AbstractBlockedUnitRange ) = isempty (blocklasts (a)) ? zero (eltype (a)) : Integer (last (blocklasts (a))- first (a)+ oneunit (eltype (a)))
226
226
227
227
"""
228
+ blockisequal(a::AbstractArray, b::AbstractArray)
228
229
blockisequal(a::AbstractUnitRange{<:Integer}, b::AbstractUnitRange{<:Integer})
229
230
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.
231
234
232
235
# Examples
233
236
```jldoctest
@@ -251,6 +254,29 @@ true
251
254
252
255
julia> blockisequal(b1, b2)
253
256
false
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
254
280
```
255
281
"""
256
282
blockisequal (a:: AbstractUnitRange{<:Integer} , b:: AbstractUnitRange{<:Integer} ) = first (a) == first (b) && blocklasts (a) == blocklasts (b)
@@ -265,6 +291,92 @@ blockisequal(::Tuple{}, ::Tuple{}) = true
265
291
blockisequal (:: Tuple , :: Tuple{} ) = false
266
292
blockisequal (:: Tuple{} , :: Tuple ) = false
267
293
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... )
268
380
269
381
_shift_blocklengths (:: AbstractBlockedUnitRange , bl, f) = bl
270
382
_shift_blocklengths (:: Any , bl, f) = bl .+ (f - 1 )
0 commit comments