读取带有NA为空matlab

时间:2015-08-27 16:39:23

标签: matlab nan

我有一个文本文件D,包含我要阅读的n行和5列。每行代表一个向量。但是,如果值等于NA,我想将其留空:

d

122 12 10 NA NA
110 10 30 45 87 
110 12 10 NA NA
..

我这样做:

bid = fopen(D,'r');
bfile = textscan(bid,'%d %d %d %s %s','TreatAsEmpty',{'NA'})
var=122;
IndVar=bfile {:,1}==var;
rest=bfile(:,[2:end])
vecVar=rest(IndVar)

我想从没有NA的行获取向量: vecVar = [12 10]; [10 30 45 87]; [12 10];

我试试这个:

rest= rest(~isnan(rest));

我收到错误:

未定义函数'isnan'用于'cell'类型的输入参数。

我已经玩了一个多小时了,现在仍然无法弄清楚.. 任何帮助将非常感谢!

非常感谢!

2 个答案:

答案 0 :(得分:2)

如错误消息中所述,isnan仅适用于数字数组。要对数字数组的单元格数组进行操作,请使用cellfun,它将命令应用于数组中的每个单元格。另外,NaN内部实际上是一个数字(单个或双重),因此您需要使用NaN的数字版本而不是文本字符串' NA'对于空值,var是内置命令,因此您需要更改该变量名称。 您需要澄清一点,但据我所知,给定包含矩阵的输入文件: 122 12 10 NA NA 110 10 30 45 87 110 12 10 NA NA 你期望: vecVar = {...     [12 10];     [10 30 45 87];     [12 10]     }; 在我的第一个答案中,我错过了你用整数读书的事实。这将给出上面的结果,我认为你正在追求的是: bid = fopen(d,' r'); %整数没有NaN,所以请以float形式读取。 %,也将所有内容收集到一个矩阵中,因为它可以实现。 %更容易调试 bfile = textscan(bid,'%f%f%f%f,%f',' TreatAsEmpty',' NA',' CollectOutput' ;,真实); FCLOSE(d); %从单元格转换为矩阵以生成i bfile = bfile {1}; VAR = 122; IndVar = bfile(:,1)== var; rest = bfile(:,2:end); %将矩阵转回单元格,每行单个单元格 [nrows,ncols] =大小(休息); rest = mat2cell(rest,ones(nrows,1),ncols); %摆脱了NaN值 rest = cellfun(@(x)x(~isnan(x)),rest,' UniformOutput',false); 这将生成一个单元格数组,其中每个元素都包含一个可以使用desired_vector = rest {index_of_your_choice}检索的向量;

答案 1 :(得分:1)

这里是将每行数值放入单元格数组val的代码:

    %'Number of columns'
    NC = 5;

    %'Read the strings'
    f = fopen('test.txt', 'r');
    raw= textscan(f, repmat('%s',1,NC));
    fclose(f);
    if numel(raw) ~= NC
            error('Something is wrong with the file format');
    else
            NR = numel(raw{1});
    end;

    %'Convert data'
    for c = 1:NC
            for r = 1:NR
                    raw{c}{r} = sscanf(raw{c}{r}, '%d');
            end;
    end;

    %'Concatenate rows into val'
    val = cell(1,NR);
    buf = cell(1,NC);
    for r = 1:NR
            for c = 1:NC
                    buf{c} = raw{c}{r};
            end;
            val{r} = [buf{:}];
    end;

您不能使用普通矩阵来存储值,因为存在具有不同数量值的行。这意味着行向量只能存储到单元阵列中。