我有八列数据。 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
等,但这非常耗时。任何建议都会非常受欢迎。
答案 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