在一定条件下删除单元格数组的行范围,MATLAB

时间:2018-10-04 16:42:48

标签: matlab cell logical-operators

我有一个非常大的单元格数组,其中包含很多度量。通常,测量范围为3至15米。我的问题是其中一些测量值没有此范围,因此它是无效数据,我想从我的细胞阵列中删除这些数据范围。

这是我尝试过的内容(在简历中):

ind_cond = find(strcmp('Machine',A{:,1}));
A = table2cell(A);

for i = 1:(length(ind_cond)-1);
cond = ismember(A(ind_cond(i):ind_cond(i+1),11),'15');
if cond == 0
   A(ind_cond(i):ind_cond(i+1),11) = [];
    end
end

因此,我首先搜索“ Machine”一词,因为它在所有标题中,因此我可以获得测量的总数。然后,我尝试在测量范围内找到字符串“ 15”(稍后将其转换为num),如果没有“ 15”,我想从数组中删除该行范围。 我收到以下错误:

“空分配只能有一个非冒号索引”

非常感谢

编辑:

这里是数据外观的图片(抱歉,我不知道该如何上传。是.csv文件)

11列很重要,这是我感兴趣的数据。问题是例如某些数据集(从0.25米到17米,很多)不完整,因为它们没有值“ 15”,因此我想在这种情况下删除整个数据集。

我第一次尝试做这样的事情

for i = 1:(length(ind_cond)-1);
  if ind_cond(i+1,1)- ind_cond(i,1) < 30 ;
     A(ind_cond(i):ind_cond(i+1),:) = [];
     end
end

它运行良好,但是不会删除所有有冲突的数据,因为我有一(1)个非常大的数据集,其中没有“ 15”,并且上述条件无法消除它。

在图片“我要删除的内容”中,举例说明了冲突数据的状态,我想删除所有这些数据。 Overview of data What i want to delete

1 个答案:

答案 0 :(得分:1)

如果要删除没有字符串“ 15”的单元格,则可以执行以下操作:

A = [{'TEST'} {'Machine'} ; ...
{'test1'} {'3'}; ...
{'test2'} {'7'}; ...
{'test3'} {'16'}; ...
{'test4'} {'15'} ; ...
{'test5'} {'1'}; ...
{'test6'} {'8'}];
machine_cell = A(:,2);
% keep only cells that where there in no '15'
new_A = A(contains(machine_cell,'15'),:);

新的单元格数组将是:

>> new_A =

  1×2 cell array

{'test4'}    {'15'}

相反,保留所有没有'15'的单元格,然后取反contains

new_A = A(~contains(machine_cell,'15'),:);
>> new_A =

  6×2 cell array

    {'TEST' }    {'Machine'}
    {'test1'}    {'3'      }
    {'test2'}    {'7'      }
    {'test3'}    {'16'     }
    {'test5'}    {'1'      }
    {'test6'}    {'8'      }