Arrays 在忽略所有NaN和x27的情况下,对两个向量进行元素级比较;在两者之间

Arrays 在忽略所有NaN和x27的情况下,对两个向量进行元素级比较;在两者之间,arrays,matlab,vector,nan,Arrays,Matlab,Vector,Nan,我有两个向量1x5000。它们由如下数字组成: vec1=[NaN-NaN 2 NaN-NaN 5 NaN 8 NaN-NaN 7 NaN 5 NaN 3 NaN 4] vec2=[nan2 NaN NaN 5 NaN NaN NaN 8 NaN 1 NaN NaN NaN 5 NaN NaN NaN NaN NaN] 我想检查数字的顺序是否相等,与NaNs无关。但是我不想删除NaNs(非数字),因为我以后会使用它们。现在我创建了一个新的向量,并将其称为results。一旦它们以相同的顺序出现,

我有两个向量1x5000。它们由如下数字组成:

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

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

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

对于
vec1
vec2
,示例
results
如下所示:
[1 1 0 1 0]

前3个数字相同,然后将7与1进行比较,得出0,然后将5与5进行比较,得出1。然后,最后两个数字缺失,即0

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


非常感谢您的帮助

我会这样做:

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
s的关注,取决于您希望对阵列执行的操作。如果要处理它们,则删除
NaN
s更方便。为了跟踪事物,您可以保留保留元素的索引:

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
s,解决方案将是相同的,所有
temp
s将替换为
vec

,我将这样做:

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
s的关注,取决于您希望对阵列执行的操作。如果要处理它们,则删除
NaN
s更方便。为了跟踪事物,您可以保留保留元素的索引:

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
s,解决方案将是相同的,所有
temp
s将替换为
vec

这将是我的解决方案,使用逻辑索引和查找功能的混合。返回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

这就是我的解决方案,混合使用逻辑索引和find函数。返回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

这似乎工作得很好,谢谢!只有一个问题,我有一个向量time1和time2。对于每个1和0,我可以得到vec1和vec2的时间吗?时间向量的长度相同。我假设
time1
是一个时间向量,每个元素对应
vec1
中的一个元素。然后是的,您可以通过以下方式获得
NaN
-free
vec1
的所有时间:
newtime1=time1(id1)关于时间向量的正确性,我自动想要得到vec1和vec2中每个1和0的时间。这能做到吗?这里有个问题;您正在检查这些值是否相等,而不考虑它们在
vec
s中的索引或它们的时间,只是根据它们的顺序。您如何确定您的示例中的
2
2
属于同一时间实例?它们不属于同一时间实例,我只想离开时间。因为我稍后会比较vec1和vec2中的数字之间经过了多少秒。这似乎非常有效,谢谢!只有一个问题,我有一个向量time1和time2。对于每个1和0,我可以得到vec1和vec2的时间吗?时间向量的长度相同。我假设
time1
是一个时间向量,每个元素对应
vec1
中的一个元素。然后是的,您可以通过以下方式获得
NaN
-free
vec1
的所有时间:
newtime1=time1(id1)关于时间向量的正确性,我自动想要得到vec1和vec2中每个1和0的时间。这能做到吗?这里有个问题;您正在检查这些值是否相等,而不考虑它们在
vec
s中的索引或它们的时间,只是根据它们的顺序。您如何确定您的示例中的
2
2
属于同一时间实例?它们不属于同一时间实例,我只想离开时间。因为我稍后会比较vec1和vec2中的数字之间经过了多少秒。