两个向量的逐元素比较,同时忽略其间的所有 NaN
Elementwise comparison of two vectors while ignoring all NaN's in between
我有两个向量 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 (Not-a-Number),因为我稍后会用到它们。所以现在我创建了一个新向量并将其命名为 results
。一旦它们以相同的顺序出现,它就是正确的,我们用 1
填充 results
。如果接下来的数字不相等,我们将 0
添加到 results
。
results
的示例对于 vec1
和 vec2
如下所示:
[1 1 1 0 1 0 0]
前三个数字相同,然后 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
更方便。为了跟踪事物,您可以保留保留元素的索引:
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 和 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
我有两个向量 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 (Not-a-Number),因为我稍后会用到它们。所以现在我创建了一个新向量并将其命名为 results
。一旦它们以相同的顺序出现,它就是正确的,我们用 1
填充 results
。如果接下来的数字不相等,我们将 0
添加到 results
。
results
的示例对于 vec1
和 vec2
如下所示:
[1 1 1 0 1 0 0]
前三个数字相同,然后 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
更方便。为了跟踪事物,您可以保留保留元素的索引:
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 和 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