两个向量的元素比较,同时忽略

时间:2016-10-10 11:25:07

标签: arrays matlab vector nan

我有两个向量1x5000。它们由这样的数字组成:

vec1 = [NaN NaN 2 NaN NaN NaN 5 NaN 8 NaN NaN 7 NaN 5 NaN 3 NaN 4]

vec2 = [NaN 2 NaN NaN 5 NaN NaN NaN 8 NaN 1 NaN NaN NaN 5 NaN NaN NaN]

我想检查数字的顺序是否相等,与NaN无关。但我不想删除NaN s(非数字),因为我稍后会使用它们。所以现在我创建一个新的向量并将其称为results。一旦他们按相同的顺序排列,就是正确的,我们会将results填入1。如果下一个数字不相等,我们会将0添加到results

resultsvec1的示例vec2如下所示: [1 1 1 0 1 0 0]

前3个数字是相同的,然后7个被比较为1给出0,然后5个被比较为5是真的给出1.然后最后两个数字丢失,给出0。

我不想删除NaN的一个原因是我有1x500的时间向量,不知怎的,我想得到每个1和0的时间(在新的向量中)。这也可能吗?

非常感谢帮助!

2 个答案:

答案 0 :(得分:3)

我就是这样做的:

temp1 = vec1(~isnan(vec1));
temp2 = vec2(~isnan(vec2));
m = min(numel(temp1), numel(temp2));
M = max(numel(temp1), numel(temp2));
results = [(temp1(1:m) == temp2(1:m)), false(1,M-m)];

请注意,此处results是二进制数组。如果你需要数字,你可以将它转换为例如。

关于您对NaN的关注,取决于您对阵列的要求。如果您要处理它们,删除NaN会更方便。为了保持事物的轨迹,你可以保留所保留元素的索引:

id1 = find(~isnan(vec1));
vec1 = vec1(id1);

vec1 =

     2     5     8     7     5     3     4

id1 =

     3     7     9    12    14    16    18

% and same for vec2

如果您决定删除NaN,则解决方案将相同,所有temp替换为vec

答案 1 :(得分:1)

这将是我的解决方案,使用逻辑索引和查找功能的混合。返回1和0的时间戳实际上比找到1和0更乏味。

vec1 = [NaN NaN 2 NaN NaN NaN 5 NaN 8 NaN NaN 7 NaN 5 NaN 3 NaN 4];
vec2 = [NaN 2 NaN NaN 5 NaN NaN NaN 8 NaN 1 NaN NaN NaN 5 NaN NaN NaN];
t=1:numel(vec1);

ind1=find(~isnan(vec1));
ind2=find(~isnan(vec2));
v1=vec1(ind1);
v2=vec2(ind2);
if length(v1)>length(v2)
   ibig=1; 
else
    ibig=2;
end
n=min(length(v1),length(v2));
N=max(length(v1),length(v2));
v=false(1,N);
v(1:n)=v1(1:n)==v2(1:n);

t_ones1=t(ind1(v));
t_ones2=t(ind2(v));
if ibig==1
    t_zeros1=t(ind1(~v));
    t_zeros2=t(ind2(~v(1:n)));
else
    t_zeros1=t(ind1(~v(1:n)));
    t_zeros2=t(ind2(~v));
end