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)) = [];

したがって、最初に のすべての'NaN'文字列がおよびを使用しrawて置き換えられ、結果が に格納されます。次に、 とを使用しての各文字列をと比較することにより、論理行列が作成されます。最後に、対応する列の中で 1 のみを含む列が削除されます。''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 に答える