如何从数组中仅提取非零值并将它们放入单元格中

时间:2013-07-16 15:34:19

标签: matlab

我有:

X6 =

  Columns 1 through 18
 5     3     5     5     4     1     4     4     2     4     4     4     4     4     4     5     5     4
 5     4     4     3     3     4     5     2     4     5     2     4     4     4     4     5     4     5
 5     2     4     4     2     3     3     3   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
 2     3     3     3   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
 4     5     3     3     2     3     3     3     3   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
 3     2     4     2     3     3     5   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
 2     4     4     5     4     5     5   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
 4     2     5     5   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

  Columns 19 through 27 

     4     5     4     4     4     4     3     3     4
     3     3     4   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN   NaN

我希望制作一个单元格X6cell,逐行获取非零X6值。

所以X6cell{1}={1x27}, X6cell{8}={1x4}等...

for i=1:size(X6,1)
X6cell{i}=X6(X6(i,:)~=isnan);
end

不太对劲。

1 个答案:

答案 0 :(得分:2)

你快到了。语法是:

for i=1:size(X6,1)
    X6cell{i}=X6(i,~isnan(X6(i,:)));
end

(另一种选择:如果您还想忽略任何Inf值和NaN,您也可以使用isfinite(X6(i,:)),这有时会很有用)

删除零(或任何个别号码):

for i=1:size(X6,1)
    X6cell{i}=X6(i,X6(i,:)~=0);
end

要删除任意数量的数字,请使用~ismember

discard_values=[1 5 7 20 100];
for i=1:size(X6,1)
    X6cell{i}=X6(i,~ismember(X6(i,:),discard_values));
end

要链接这些规则(为了清晰起见引入新变量),请使用&

discard_values=[1 5 7 20 100];
for i=1:size(X6,1)
    indices_to_keep= ~ismember(X6(i,:),discard_values) & ~isnan(X6(i,:));
    X6cell{i}=X6(i,indices_to_keep);
end