matlab中的元胞数组中的数字是字符型保存,存在nodata。。如何转换成数值型矩阵????

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中的元胞数组中的数字是字符型保存,存在nodata。。如何转换成数值型矩阵????相关的知识,希望对你有一定的参考价值。

我现有的数据是字符型, 是栅格数据,空值是以nodata形式出现,每行每列中出现的nodata则表示其该地方没有要素。
我想把原始字符型数据转换成数字矩阵,nodata的地方用str2num会报错。

先把元胞数组中所有的'nodata'改为'nan'
用str2num是可以识别’nan‘的

假设你的原来的元胞数组存在变量a中

b=a;%b复制a
b(strcmp(b,'nodata'))='nan';%b中'nodata'的单元转化为'nan'
b=cellfun(@str2num,b);%将b转化为数值

nodata的地方会显示为nan是not a number的意思
参考技术A 你应该是读入数据不对吧? 而不是说考虑把文本转换成数字。 建议你把原始数据重新整理一下,不存在的值替换为-1之类的特殊标记数字,然后统一读数据就可以。 如果是xls文件,可以用[num, txt, raw] = xlsread(xlsfilename, sheetname)来读取如果是txt文件,考虑用importdata比较不错。当然全是纯数字的话,load就足够了

在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵

【中文标题】在 MATLAB 中使用 MEX 文件访问存储在元胞数组中的矩阵【英文标题】:Accessing matrices stored inside of cell arrays using MEX files in MATLAB 【发布时间】:2012-04-16 18:08:11 【问题描述】:

我目前正在编写一个 MEX 函数,该函数必须与 MATLAB 中的元胞数组一起使用。 MEX 文件是用 C 语言编写的。

本质上,我的函数的输入将是一个元胞数组,其中每个条目都是一个具有实数值的数值矩阵。一个简单的例子是:

C = cell(1,2);
C1 = ones(10,10);
C2 = zeros(10,4);

我希望能够访问我的 MEX 文件中的数值数组 C1 和 C2。理想情况下,我希望这样做,而不必在我的 MEX 文件中创建数据的第二个副本(即获取它们的指针)。

使用前面的例子,我目前的做法如下:

/* declare a pointer variable to the incoming cell array after it is passed to the MEX function */
mxArray C_CELL = (mxArray *) mxGetData(prhs[0]) 

/* declare  a 2 x 1 array of pointers to access the cell array in C */
double *myarray[2] //

/* point towards the contents of C_CELL */
myarray[0] = mxGetPr(C_CELL[0])
myarray[1] = mxGetPr(C_CELL[1])

不幸的是,这似乎会产生“无效使用未定义类型'struct mxArray_tag'”错误。

【问题讨论】:

'无效使用未定义类型'通常意味着缺少头文件,您甚至没有显示您的包含。 【参考方案1】:

您需要使用mxGetCell 来提取元胞数组的内容。

mxArray *cellArray[2];
cellArray[0] = mxGetCell(prhs[0], 0);
cellArray[1] = mxGetCell(prhs[0], 1);

【讨论】:

【参考方案2】:

该代码示例中有很多问题:

每行都缺少尾随分号 mxArrays 必须定义为指针:例如,mxArray *C_CELL

但根据您收到的错误消息,我想您在使用的源中具有正确的这些项目。

您的主要问题是将mxGetData 的输出分配给mxArray *mxGetData 的工作方式是它返回一个指向矩阵内容的原始 (void *) 指针。在这种情况下,您的矩阵包含mxArray 指针数组,具有两级指针重定向。

因此,C_CELL 必须定义为 mxArray **C_CELL。请注意,在没有任何完整性检查或绑定检查的情况下执行此操作将迅速导致段错误。正如@David Heffernan 所建议的那样使用mxGetCell 是一种更安全、更可靠的方法(假设您已检查您的prhs[0] 是否包含一个元胞数组)。

【讨论】:

以上是关于matlab中的元胞数组中的数字是字符型保存,存在nodata。。如何转换成数值型矩阵????的主要内容,如果未能解决你的问题,请参考以下文章

如何使用MATLAB进行元胞数组批量提取数据?

MATLAB中,我要把元胞数组中的字符串提取出来,应该用啥函数?

matlab中的元胞数组如何实现批量的赋值呢?

操作存储在元胞数组中的矩阵——Matlab

如何在 MATLAB 的元胞数组中搜索字符串?

MATLAB的cell数组