用NaN替换选择性数字

时间:2014-04-30 13:54:39

标签: performance matlab matrix nan

我有八列数据。 Colulmns 1,3,5和7包含3位数字。列2,4,6和8包含1和0,分别对应于1,3,5和7。如果偶数列中有零,我想将相应的数字更改为NaN。更简单的说,如果它是

155            1           345           0
328            1           288           1
884            0           145           0
326            1           332           1
159            0           186           1

然后884将被NaN替换,159,345和145将被替换,其他数字保持不变。我需要使用NaN以矩阵形式维护数据。 我知道我可以使用

data(3,1)=Nan; data(5,1)=Nan

等,但这非常耗时。任何建议都会非常受欢迎。

5 个答案:

答案 0 :(得分:4)

方法1

a1 = [
    155            1           345           0
    328            1           288           1
    884            0           145           0
    326            1           332           1
    159            0           186           1]

t1 = a1(:,[2:2:end])
data1 = a1(:,[1:2:end])

t1(t1==0)=NaN
t1(t1==1)=data1(t1==1)

a1(:,[1:2:end]) = t1

输出 -

a1 =

   155     1   NaN     0
   328     1   288     1
   NaN     0   NaN     0
   326     1   332     1
   NaN     0   186     1

方法2

[x1,y1] = find(~a1(:,[2:2:end]))
a1(sub2ind(size(a1),x1,2*y1-1)) = NaN

答案 1 :(得分:3)

我会将问题分成两个矩阵,一个是逻辑掩码,另一个是数据。

data = your_mat(:,1:2:end);
valid = your_mat(:,2:2:end);

然后你就可以做到:

data(~valid)=NaN;

然后您可以通过执行以下操作重建数据:

your_mat(:,1:2:end) = data;

答案 2 :(得分:2)

这是一个有趣的解决方案,我希望它表现得相当不错,但请注意它有点棘手!

data(~data(:,2:end))=NaN

答案 3 :(得分:0)

这是另一种解决方案。您可以按以下方式使用circshift

首先创建一个与输入矩阵A:

大小相同的偶数列的掩码
AM = false(size(A)); AM(:,2:2:end) = true;

然后将掩码(A==0)&AM向左旋转一个元素,将这个掩码移到奇数列上。

A(circshift((A==0)&AM,[0 -1])) = nan;

注意:我已经搜索了一行内容...我认为它不是一个好的,但根据我的解决方案,这里有一个你可以使用的内容:

A(circshift(bsxfun(@and, A==0, mod(0:size(A,2)-1,2)),[0 -1])) = nan;

bsxfun的脏东西是在线创建掩码AM。我使用索引向量的奇数测试bsxfun将其扩展到整个矩阵A上。当然,你可以做任何其他事情来创建这个掩码。

答案 4 :(得分:0)

使用逻辑索引:

even = a1(:,2:2:end);    % even columns
odd  = a1(:,1:2:end);    % odd columns
odd(even == 0) = NaN;    % set odd columns to NaN if corresponding col is 0
a1(:,1:2:end)  = odd;    % assign back to a1

a1 = 
   155     1   NaN     0
   328     1   288     1
   NaN     0   NaN     0
   326     1   332     1
   NaN     0   186     1