-
Notifications
You must be signed in to change notification settings - Fork 8
/
hssoption.m
97 lines (85 loc) · 2.44 KB
/
hssoption.m
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
function opt = hssoption(key, value)
%HSSOPTION Set or get an option for the hss toolbox.
%
% Valid options are:
% 'block-size': Integer representing the minimum block size.
% 'threshold': Value used for off-diagonal truncation.
% 'compression': String indicating the strategy of compression (qr or svd)
% 'norm': The norm used for truncation. Can be either 2, or 'fro', and
% the truncation is performed relative to the norm of the entire
% matrix.
%
% The special option HSSOPTION('clear') can be used to load all the
% default values, clearing all the previous HSSOPTION commands.
global hss_block_size
global hss_threshold
global hss_compression
global hss_norm
if strcmp(key, 'clear')
if exist('value', 'var')
error('Specifying a value is unsupported for the special option "clear"');
end
clear hss_block_size;
clear hss_threshold;
clear hss_compression;
clear hss_norm;
return;
end
if isempty(hss_block_size)
hss_block_size = 256;
end
if isempty(hss_compression)
hss_compression = 'svd';
end
if isempty(hss_threshold)
hss_threshold = 1e-12;
end
if isempty(hss_norm)
hss_norm = 2;
end
if ~exist('key', 'var')
error('Please specify a key');
end
if ~exist('value', 'var')
switch key
case 'block-size'
opt = hss_block_size;
case 'threshold'
opt = hss_threshold;
case 'compression'
opt = hss_compression;
case 'norm'
opt = hss_norm;
otherwise
error('Unsupported option specified');
end
else
switch key
case 'block-size'
if value <= 2
error('minimum block size must be at least 3');
else
hss_block_size = value;
end
case 'threshold'
if value < 0
error('threshold has to be positive');
else
hss_threshold = max(eps, value);
end
case 'compression'
if strcmp(value,'qr') || strcmp(value, 'svd')
hss_compression = value;
else
error('Invalid valud for compression');
end
case 'norm'
if ( ischar(value) && ~strcmp(value, 'fro') ) && value ~= 2
error('Invalid valud for norm');
else
hss_norm = value;
end
otherwise
error('Unsupported option specified');
end
end