Source code for mrinversion.linear_model.tsvd_compression
# -*- coding: utf-8 -*-
import csdmpy as cp
from mrinversion.linear_model.linear_inversion import reduced_subspace_kernel_and_data
from mrinversion.linear_model.linear_inversion import TSVD
[docs]class TSVDCompression:
"""SVD compression.
Args:
K: The kernel.
s: The data.
r: The number of singular values used in data compression.
Attributes
----------
truncation_index: int
The number of singular values retained.
compressed_K: ndarray
The compressed kernel.
compressed_s: ndarray of CSDM object
The compressed data.
"""
def __init__(self, K, s, r=None):
U, S, VT, r_ = TSVD(K)
if r is None:
r = r_
self.truncation_index = r
if isinstance(s, cp.CSDM):
signal = s.dependent_variables[0].components[0].T
else:
signal = s
(
self.compressed_K,
compressed_signal,
_, # projectedSignal,
__, # guess_solution,
) = reduced_subspace_kernel_and_data(U[:, :r], S[:r], VT[:r, :], signal)
factor = signal.size / compressed_signal.size
print(f"compression factor = {factor}")
if isinstance(s, cp.CSDM):
self.compressed_s = cp.as_csdm(compressed_signal.T.copy())
if len(s.dimensions) > 1:
self.compressed_s.dimensions[1] = s.dimensions[1]
else:
self.compressed_s = compressed_signal