1

我有一个矩阵:

raw = 

'alon'     'tomer'    'ilana'    'T1'     '2'      '53'      '24'       'NaN'
'ilana'    'oren'     '6'        'a'      'g'      'g'       'gsh'      'NaN'
'dikla'    'aba'      'mama'     'a'      'h'      'ghfs'    'bfsbf'    'NaN'
'4'        'NaN'      'NaN'      'nn'    'NaN'    'NaN'     'hadhd'    'NaN'

我想删除 NaN 并获得:

    'alon'     'tomer'    'ilana'    'T1'     '2'      '53'      '24'
    'ilana'    'oren'     '6'        'a'      'g'      'g'       'gsh'
    'dikla'    'aba'      'mama'     'a'      'h'      'ghfs'    'bfsbf'
    '4'         ''        ''         'nn'     ''       ''        'hadhd'

我怎么做?

我尝试了很多建议,但我得到了错误:

1)

>> raw=raw(~isnan(raw(:,2)),:)
??? Undefined function or method 'isnan' for input arguments of type 'cell'.

2)

raw(isnan(raw(:,1)),:) = [];
??? Undefined function or method 'isnan' for input arguments of type 'cell'.

3)

raw(~any(isnan(raw),2),:)
??? Undefined function or method 'isnan' for input arguments of type 'cell'.

4)

T(cellfun(@isnan,T))={0}
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.

我尝试了 Ansari 的解决方案,但现在我得到了:

raw = 

'alon'     'tomer'    'ilana'    'T1'    '2'    '53'      '24'       [0]
'ilana'    'oren'     '6'        'a'     'g'    'g'       'gsh'      [0]
'dikla'    'aba'      'mama'     'a'     'h'    'ghfs'    'bfsbf'    [0]
'4'        [    0]    [    0]    'nn'    [0]    [   0]    'hadhd'    [0]

这对我不好,因为我想做:

size(raw,2) 

并得到:

7

4

4 回答 4

3

像这样的东西会起作用:

f = @(x) strcmp(x, 'NaN');
nans = cellfun(f, raw);
raw(nans) = {''}; %cell(sum(nans(:)), 1);

isnan仅适用于矩阵,因此不适用于元胞数组。此外,您的 NaN 似乎是字符串,而不是真正的 NaN。

此时,所有的 'NaN' 都将是空字符串。以下将删除空字符串的整行或列:

raw = raw(:, arrayfun(@(i) length([raw{:, i}]), 1:size(raw, 2)) > 0); % for columns
raw = raw(arrayfun(@(i) length([raw{i, :}]), 1:size(raw, 1)) > 0, :); % for rows

对于最后一步,您最好循环以保持代码干净和易于理解(并且更容易调试!)。您基本上是通过连接字符串来折叠每一行或每一列,然后检查长度是否为零,以及是否要删除该行或列。

于 2012-06-14T21:29:04.593 回答
1

使用的替代答案regexprep

% 示例数据:

raw = { 'alon' 'tomer' 'ilana' 'T1' '2' '53' '24' 'NaN'; 'ilana' 'oren' '6' 'a' 'g' 'g' 'gsh' 'NaN'; 'dikla' 'aba' 'mama' 'a' 'h' 'ghfs' 'bfsbf' 'NaN'; '4' 'NaN' 'NaN' 'nn' 'NaN' 'NaN' 'hadhd' 'NaN' }

这是代码:

output = cellfun(@(x) regexprep(x, 'NaN', ''), raw, 'UniformOutput', false);
NaNraw = cellfun(@(x) strcmp(x, 'NaN'), raw);
output(:,all(NaNraw,1)) = [];

因此,首先使用and替换所有'NaN'字符串,结果存储在. 然后通过使用and比较with的每个字符串来创建一个逻辑矩阵。最后,删除其对应列仅包含一列的列。raw''cellfunrepexprepoutputNaNrawraw'NaN'cellfunstrcmpoutputNaNraw

output = 
'alon'     'tomer'    'ilana'    'T1'    '2'    '53'      '24'   
'ilana'    'oren'     '6'        'a'     'g'    'g'       'gsh'  
'dikla'    'aba'      'mama'     'a'     'h'    'ghfs'    'bfsbf'
'4'        ''         ''         'nn'    ''     ''        'hadhd'
于 2012-06-14T22:39:44.527 回答
1

你似乎过度劳累了。

cooked = regexprep(raw,'NaN','');

可以。


当然,假设您没有为您不编写的每一行代码获得额外的 1000 美元:

cooked = raw;
for I = 1:length(raw(:))
    if strcmp(raw{I},'NaN')
        cooked{I} = '';
    end
end
于 2012-06-15T01:23:09.500 回答
1

另一种解决方案:

%# replace all 'NaN' with ''
raw(ismember(raw,'NaN')) = {''};

%# remove rows/columns of all empty strings
raw(:,all(cellfun(@isempty,raw),1)) = [];
raw(all(cellfun(@isempty,raw),2),:) = [];
于 2012-06-18T08:03:07.277 回答