1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
function fl = luflops (L, U)
%LUFLOPS compute the flop count for sparse LU factorization
%
% Example:
% fl = luflops (L,U)
%
% Given a sparse LU factorization (L and U), return the flop count required
% by a conventional LU factorization algorithm to compute it. L and U can
% be either sparse or full matrices. L must be lower triangular and U must
% be upper triangular. Do not attempt to use this on the permuted L from
% [L,U] = lu (A). Instead, use [L,U,P] = lu (A) or [L,U,P,Q] = lu (A).
%
% Note that there is a subtle undercount in this estimate. Suppose A is
% completely dense, but during LU factorization exact cancellation occurs,
% causing some of the entries in L and U to become identically zero. The
% flop count returned by this routine is an undercount. There is a simple
% way to fix this (L = spones (L) + spones (tril (A))), but the fix is partial.
% It can also occur that some entry in L is a "symbolic" fill-in (zero in
% A, but a fill-in entry and thus must be computed), but numerically
% zero. The only way to get a reliable LU factorization would be to do a
% purely symbolic factorization of A. This cannot be done with
% symbfact (A, 'col').
%
% See NA Digest, Vol 00, #50, Tuesday, Dec. 5, 2000
%
% See also symbfact
% CCOLAMD, Copyright (c) 2005-2022, Univ. of Florida, All Rights Reserved.
% Authors: Timothy A. Davis, Sivasankaran Rajamanickam, and Stefan Larimore.
% SPDX-License-Identifier: BSD-3-clause
Lnz = full (sum (spones (L))) - 1 ; % off diagonal nz in cols of L
Unz = full (sum (spones (U')))' - 1 ; % off diagonal nz in rows of U
fl = 2*Lnz*Unz + sum (Lnz) ;
|