安装SNCTOOLS,是以前版本的matlab用的netcdf包
javaaddpath([pwd '/netcdfAll-4.3.jar']);
javaaddpath ([pwd '/mexcdf/snctools/classes']);
addpath ([pwd '/mexcdf/mexnc']);
addpath ([pwd '/mexcdf/snctools']);
RNT包中构建了netcdf结构体,简化了matlab读写编程,程序需要调用mexnc库。
运行注意更改mexcdf、mexnc等函数的matlab版本判断,经实验在2018b中可以正常运行
netcdf 函数调用路径由错误追踪如下
Error in mexnc_tmw (line 124)
[varargout{:}] = handler ( varargin{:} );
Error in mexnc (line 552)
[varargout{:}] = backend(varargin{:});
Error in mexcdf53 (line 9)
[varargout{:}] = feval('mexnc', varargin{:});
Error in ncmex (line 112)
[varargout{:}] = feval(fcn, varargin{:});
Error in ncatt (line 123)
status = ncmex('attput', theNCid, theVarid, ...
Error in netcdf/subsasgn (line 121)
result = ncatt(theAttname, ncclass(other), other, self);
目前碰到的问题是netcdf结构对象用来读取数据正常,但是写文件无法写到文件中去,正在排查原因
目前排查mexnc函数可以正常写入维数信息
/public4/home/pgv3234/roms/matlab/SNCTOOLS/mexcdf/mexnc/mexnc.m
经过一天的排查,原因在于在netcdf结构体中,源代码中为了便于排查错误,在写入数据时,采用了Tempname,先赋值一个任意名字,后面再用rename操作改名字,但是名字采用了"--------",新的matlab函数不支持这种特殊符号,所以没有写入数据
netcdf函数中普遍采用status来处理错误,status=-1表示出错,但是并不会有报错信息,所以排查bug时要注意
搜寻代码的语句
grep -n 'Tempname' `find ./ -name '*.m'`
将找到的地方替换
%theTempname( : ) = '-';
theTempname( : ) = 'a';
另外还有待解决的问题,删除维数时有时出错,导致整个netcdf变成了空文件;
netcdf子结构体报错,报错信息如下:
对于全局属性,问题如下:
>> nc.glbatt(:)
glbtst
>> nc.glbatt(:)=[]
Brace indexing is not supported for variables of this type.
Error in ncatt/subsasgn (line 67)
if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')
Error in netcdf/subsasgn (line 129)
result = subsasgn(att(self, theAttname), s, other);
>> g=nc.glbatt
g =
NetCDF_Attribute: 'glbatt'
itsType: 'char'
itsLength: 6
itIsUnsigned: 0
>> g(:)=[]
Brace indexing is not supported for variables of this type.
Error in ncatt/subsasgn (line 67)
if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')
>> g(:)
Undefined function or variable 'theResult'.
Error in ncatt/subsref (line 81)
disp(theResult)
对于变量属性,问题如下
> v1=nc{'var1'}
v1 =
NetCDF_Variable: 'var1'
itsType: 'double'
itsDimensions: 'x, y'
itsLengths: [6 7]
itsOrientation: [1 2]
itsVars: {}
itsSrcsubs: {}
itsDstsubs: {}
nAttributes: 2
itIsAutoscaling: 0
itIsAutoNaNing: 0
itIsUnsigned: 0
itIsQuick: 0
>> v1.type
NetCDF_Attribute: 'type'
itsType: 'char'
itsLength: 4
itIsUnsigned: 0
>> v1.type(:)
test
>> a=v1.type
a =
NetCDF_Attribute: 'type'
itsType: 'char'
itsLength: 4
itIsUnsigned: 0
>> a(:)=[]
Brace indexing is not supported for variables of this type.
Error in ncatt/subsasgn (line 67)
if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')
>> a(:)
Undefined function or variable 'theResult'.
Error in ncatt/subsref (line 81)
disp(theResult)
>> a
a =
NetCDF_Attribute: 'type'
itsType: 'char'
itsLength: 4
itIsUnsigned: 0
>> v1.type(:)
test
对于删除属性时出错,解决方法,问题可能在于新版matlab和老版在cell格式上的不同
s = theStruct;
theType = s(1).type;
theSubs = s(1).subs;
s(1) = [];
**%commented out by hzw
%if isa(theSubs, 'cell'), theSubs = theSubs{1}; end
%end**
switch theType
case '()'
if isempty(other) & length(theSubs) == 1 & strcmp(theSubs{1}, ':')
result = delete(self); % Delete.
if nargout > 0
theResult = result;
else
disp(result)
end
return
end
otherwise
end
返回变量属性对象时的错误,目前排查原因在于
RNT_MAIN/matlib/netcdf/@ncatt/subsref.m函数中datatype出错
ncmex(‘typelen’,datatype)返回-1
RNT_MAIN/matlib/netcdf/@ncvar/datatype.m函数
发现输入’char’的函数,输出没变,本来应该是对应的数字
/public4/home/pgv3234/roms/matlab/SNCTOOLS/mexcdf/mexnc/tests/test_typelen.m
留待以后解决。
其他问题测试
(1)全局属性删除正常
(2)变量写入更改正常
(3)变量删除语句无效果
(4)属性对象直接写会报错,赋予另一个变量正常,如下所示
a =
NetCDF_Attribute: 'type'
itsType: 'char'
itsLength: 4
itIsUnsigned: 0
>> a(:)
Undefined function or variable 'theResult'.
Error in ncatt/subsref (line 81)
disp(theResult)
>> b=a(:)
b =
'test'
(5)变量属性删除正常,如a=object,a(:)=[]正常
小心使用此库,问题以后慢慢改
2. RNT工具包中有采用matlab调用Fortran的mex程序,在使用mex库时碰到了新的问题,在于代码中采用的函数比较老(报错信息中说的是obsolete),已编译好的程序,与matlab2018b不兼容,所以要重新编译。
接下来需要安装g95编译器,配套安装gcc
下载和安装说明如下http://g95.sourceforge.net/src.shtml
重新用matlab编译报错的fortran程序,mex *.f90
Function "MXCREATEFULL" is obsolete.
If your MEX file or Simulink S-function calls this function, replace it with "MXCREATEDOUBLEMATRIX".
根据报错提示,找到错误的函数,将mxCreateFull替换为mxCreateDoubleMatrix
再用matlab编译,成功通过
另一种方式,安装较老版本的matlab,尝试matlab7,但是64位机器上,安装32位的老版本还是会有错误-_-||
使用matlab2012会碰到整型变量传给实型的warning,换用ifort和icc编译器后,没有再报错,更换编译器的方法为编辑/matlab2012/bin/mexopts.sh脚本,然后使用mex -setup命令,选择上述脚本,覆盖即可
目前情况,鉴于mex编译Fortran出错,有的matlab2018可以编译通过,2012却无法通过,程序可靠性不好,因此最终放弃使用此工具包。
但是mexcdf库,netcdf结构体在其他matlab包中有应用,目前小心使用中。