Skip to content

Commit d23753d

Browse files
committed
h5save,h5size: handle scalar, vector more accurately
1 parent 479cad4 commit d23753d

File tree

9 files changed

+74
-34
lines changed

9 files changed

+74
-34
lines changed

+stdlib/+hdf5nc/h5save.m

Lines changed: 25 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,26 +20,13 @@ function h5save(filename, varname, A, opts)
2020

2121
filename = expanduser(filename);
2222

23-
if isempty(opts.size)
24-
if isvector(A)
25-
sizeA = length(A);
26-
else
27-
sizeA = size(A);
28-
end
29-
else
30-
sizeA = opts.size;
31-
end
3223
% coerce if needed
3324
A = coerce_ds(A, opts.type);
34-
if ischar(A)
35-
A = string(A);
36-
sizeA = size(A);
37-
end
3825

3926
if isfile(filename) && h5exists(filename, varname)
40-
exist_file(filename, varname, A, sizeA)
27+
exist_file(filename, varname, A, opts.size)
4128
else
42-
new_file(filename, varname, A, sizeA)
29+
new_file(filename, varname, A, opts.size)
4330
end
4431

4532
end % function
@@ -57,6 +44,10 @@ function exist_file(filename, varname, A, sizeA)
5744
start = 1;
5845
end
5946

47+
if isempty(sizeA)
48+
sizeA = defaultSize(A);
49+
end
50+
6051
if isscalar(A)
6152
h5write(filename, varname, A)
6253
elseif all(diskshape == sizeA)
@@ -71,24 +62,32 @@ function exist_file(filename, varname, A, sizeA)
7162

7263

7364
function new_file(filename, varname, A, sizeA)
74-
import stdlib.hdf5nc.auto_chunk_size
65+
7566

7667
folder = fileparts(filename);
7768
if strlength(folder) > 0 && ~isfolder(folder)
7869
error('hdf5nc:h5save:fileNotFound', '%s is not a folder, cannot create %s', folder, filename)
7970
end
8071

81-
if isscalar(A) && ~isstring(A)
82-
h5_write_scalar(filename, varname, A)
83-
elseif isvector(A)
84-
h5create(filename, varname, sizeA, 'DataType', class(A))
72+
if isempty(sizeA)
73+
if isscalar(A) && ~isstring(A)
74+
h5_write_scalar(filename, varname, A)
75+
elseif isvector(A)
76+
h5create(filename, varname, length(A), 'DataType', class(A))
77+
else
78+
create_compress(filename, varname, A, size(A))
79+
end
8580
else
86-
% enable Gzip compression--remember Matlab's dim order is flipped from
87-
% C / Python
88-
h5create(filename, varname, sizeA, 'DataType', class(A), ...
89-
'Deflate', 1, 'Fletcher32', true, 'Shuffle', true, ...
90-
'ChunkSize', auto_chunk_size(sizeA))
91-
end % if
81+
if isscalar(sizeA)
82+
if sizeA == 0 && ~isstring(A)
83+
h5_write_scalar(filename, varname, A)
84+
else
85+
h5create(filename, varname, sizeA, 'DataType', class(A))
86+
end
87+
else
88+
create_compress(filename, varname, A, sizeA)
89+
end
90+
end
9291

9392
h5write(filename, varname, A)
9493

+stdlib/+hdf5nc/h5size.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
dsi = h5info(file, variable).Dataspace;
2020
if dsi.Type == "scalar"
21-
fsize = 1;
21+
fsize = [];
2222
else
2323
fsize = dsi.Size;
2424
end

+stdlib/+hdf5nc/private/coerce_ds.m

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@
22
% used by h5save and ncsave
33
arguments
44
A
5-
dtype string
5+
dtype string {mustBeScalarOrEmpty}
66
end
77

8-
if isempty(dtype)
8+
if ischar(A)
9+
A = string(A);
910
return
1011
end
1112

12-
assert(isscalar(dtype), "dtype must be scalar")
13+
if isempty(dtype)
14+
return
15+
end
1316

1417
switch dtype
1518
case ""
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
function create_compress(filename, varname, A, sizeA)
2+
%% enable Gzip compression
3+
% remember Matlab's dim order is flipped from C / Python
4+
5+
import stdlib.hdf5nc.auto_chunk_size
6+
7+
h5create(filename, varname, sizeA, 'DataType', class(A), ...
8+
'Deflate', 1, 'Fletcher32', true, 'Shuffle', true, ...
9+
'ChunkSize', auto_chunk_size(sizeA))
10+
11+
end

+stdlib/+hdf5nc/private/defaultSize.m

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
function s = defaultSize(A)
2+
3+
if isvector(A)
4+
s = length(A);
5+
else
6+
s = size(A);
7+
end
8+
9+
end

+stdlib/TestHDF5.m

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,7 @@ function test_size(tc)
116116
basic = tc.TestData.basic;
117117

118118
s = h5size(basic, '/A0');
119-
tc.verifyTrue(isscalar(s))
120-
tc.verifyEqual(s, 1)
119+
tc.verifyEmpty(s)
121120

122121
s = h5size(basic, '/A1');
123122
tc.verifyTrue(isscalar(s))
@@ -162,6 +161,22 @@ function test_read(tc)
162161
end
163162

164163

164+
function test_shape(tc)
165+
import stdlib.hdf5nc.h5save
166+
import stdlib.hdf5nc.h5size
167+
basic = tc.TestData.basic;
168+
169+
h5save(basic, "/vector1", 34, "size", 1)
170+
s = h5size(basic, '/vector1');
171+
tc.verifyEqual(s, 1);
172+
173+
h5save(basic, "/scalar", 34, "size", 0)
174+
s = h5size(basic, '/scalar');
175+
tc.verifyEmpty(s);
176+
177+
end
178+
179+
165180
function test_coerce(tc, type)
166181
import stdlib.hdf5nc.h5save
167182
import matlab.unittest.constraints.IsFile

CITATION.cff

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,3 @@ authors:
55
orcid: https://orcid.org/0000-0002-1637-6526
66
title: Matlab-stdlib
77
doi: 10.5281/zenodo.3964540
8-
date-released: 2021-11-17

Readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ Get the dataset size (shape)
6262
h5size(filename, dataset_name)
6363
```
6464

65+
A scalar dataset will return empty `[]`.
66+
67+
---
68+
6569
Get the names of all datasets in a file
6670

6771
```matlab

codemeta.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"license": "https://spdx.org/licenses/MIT",
55
"codeRepository": "https://github.com/geospace-code/matlab-stdlib",
66
"contIntegration": "https://github.com/geospace-code/matlab-stdlib/actions",
7-
"dateModified": "2021-11-17",
7+
"dateModified": "2022-03-29",
88
"downloadUrl": "https://github.com/geospace-code/matlab-stdlib/releases",
99
"issueTracker": "https://github.com/geospace-code/matlab-stdlib/issues",
1010
"name": "matlab-stdlib",

0 commit comments

Comments
 (0)