Skip to content

Commit 79e0a1f

Browse files
committed
NetCDF4: string/char read/write scalar/array (>= R2021b)
1 parent 3905f6d commit 79e0a1f

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

+stdlib/+hdf5nc/ncsave.m

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ function ncsave(filename, varname, A, opts)
66
arguments
77
filename (1,1) string {mustBeNonzeroLengthText}
88
varname (1,1) string {mustBeNonzeroLengthText}
9-
A {mustBeNumeric,mustBeNonempty,mustBeReal}
9+
A {mustBeNonempty}
1010
opts.dims cell = {}
1111
opts.type string {mustBeScalarOrEmpty} = string.empty
1212
end
1313

1414
import stdlib.fileio.expanduser
1515
import stdlib.hdf5nc.ncexists
1616

17+
if isnumeric(A)
18+
mustBeReal(A)
19+
end
20+
21+
1722
filename = expanduser(filename);
1823

1924
if isempty(opts.dims)

+stdlib/TestNetCDF.m

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ function setup_file(tc)
2222
A3 = A2(:,1:3,1);
2323
A3(:,:,2) = 2*A3;
2424
A4(:,:,:,5) = A3;
25+
utf = 'Hello There 😄';
26+
utf2 = [utf; ""];
2527

2628
tc.TestData.A0 = A0;
2729
tc.TestData.A1 = A1;
2830
tc.TestData.A2 = A2;
2931
tc.TestData.A3 = A3;
3032
tc.TestData.A4 = A4;
33+
tc.TestData.utf = utf;
34+
tc.TestData.utf2 = utf2;
3135

3236
basic = tempname + ".nc";
3337
tc.TestData.basic = basic;
@@ -38,6 +42,8 @@ function setup_file(tc)
3842
ncsave(basic, 'A2', A2, "dims", {'x2', size(A2,1), 'y2', size(A2,2)})
3943
ncsave(basic, 'A3', A3, "dims", {'x3', size(A3,1), 'y3', size(A3,2), 'z3', size(A3,3)})
4044
ncsave(basic, 'A4', A4, "dims", {'x4', size(A4,1), 'y4', size(A4,2), 'z4', size(A4,3), 'w4', size(A4,4)})
45+
ncsave(basic, "utf", utf)
46+
ncsave(basic, "utf2", utf2)
4147

4248
tc.assumeThat(basic, IsFile)
4349
end
@@ -56,7 +62,7 @@ function test_get_variables(tc)
5662
import stdlib.hdf5nc.ncvariables
5763
basic = tc.TestData.basic;
5864

59-
tc.verifyEqual(sort(ncvariables(basic)), ["A0", "A1", "A2", "A3", "A4"])
65+
tc.verifyEqual(sort(ncvariables(basic)), ["A0", "A1", "A2", "A3", "A4", "utf", "utf2"])
6066
end
6167

6268

@@ -112,6 +118,16 @@ function test_size(tc)
112118
tc.verifyEqual(s, [4,3,2,5])
113119
tc.verifyEqual(r, 4)
114120

121+
r = ncndims(basic, 'utf');
122+
s = ncsize(basic, 'utf');
123+
tc.verifyEmpty(s)
124+
tc.verifyEqual(r, 0)
125+
126+
r = ncndims(basic, 'utf2');
127+
s = ncsize(basic, 'utf2');
128+
tc.verifyEqual(s, 2)
129+
tc.verifyEqual(r, 1)
130+
115131
end
116132

117133

@@ -138,6 +154,14 @@ function test_read(tc)
138154
s = ncread(basic, '/A4');
139155
tc.verifyEqual(ndims(s), 4)
140156
tc.verifyEqual(s, tc.TestData.A4)
157+
158+
s = ncread(basic, '/utf');
159+
tc.verifyTrue(isstring(s))
160+
tc.verifyEqual(s, string(tc.TestData.utf))
161+
162+
s = ncread(basic, '/utf2');
163+
tc.verifyTrue(isstring(s))
164+
tc.verifyEqual(s, tc.TestData.utf2)
141165
end
142166

143167

@@ -177,12 +201,6 @@ function test_name_only(tc)
177201
delete(name)
178202
end
179203

180-
function test_no_char_string(tc)
181-
import stdlib.hdf5nc.ncsave
182-
tc.verifyError(@() ncsave(tc.TestData.basic, "/a_string", "hello"), 'MATLAB:validators:mustBeNumeric')
183-
184-
end
185-
186204

187205
function test_real_only(tc)
188206
import stdlib.hdf5nc.ncsave

0 commit comments

Comments
 (0)