Matlab 获取逻辑向量中的最后x项(为真)
我有一个简单的问题,我想知道是否有一种更快的方法(即一行或更少的代码行)从逻辑向量中获取最后的X值 以下是我所拥有的:Matlab 获取逻辑向量中的最后x项(为真),matlab,Matlab,我有一个简单的问题,我想知道是否有一种更快的方法(即一行或更少的代码行)从逻辑向量中获取最后的X值 以下是我所拥有的: %define variables vec=logical([0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1]); lastX=3; %my approach idx=find(vec); %find indices of values that are true idx=idx(end-lastX+1:end); %find last X true value
%define variables
vec=logical([0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1]);
lastX=3;
%my approach
idx=find(vec); %find indices of values that are true
idx=idx(end-lastX+1:end); %find last X true values
vec(setxor(1:size(vec,2),idx))=0; %get values that are not in idx, set them false
vec %display output, should report [0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1]
通过使用的额外参数(指定要查找的值的数量以及从中查找值的端点),然后获取返回的索引,您可以创建一个简单的单行程序:
vec(1:(min(find(vec, lastX, 'last'))-1)) = false;
通过使用'reverse'
方向标志,您可以使用来计算从向量末尾到开头的true
的出现次数。如果计数大于所需的lastX
,则vec
中的该元素应为false
:
vec(cumsum(vec, 'reverse') > lastX) = false;
解决方法。可能效率很低;主要是为了好玩:
vec(1:regexp(char(vec+'0'),[repmat('10*',1,lastX) '$'])-1) = false;
美好的可能不如
查找效率高,但它将赢得一轮代码高尔夫赛@呵呵。。。是的,通过向量的3次完整传递可能比两次部分传递需要更长的时间。此外,不幸的是,此解决方案在八度音阶中不起作用,因为方向标志尚未实现。在八度音阶中,您可以使用flip
,但我猜这会在向量中增加两次传递。@CrisLuengo是的,对于code golf来说,字符也太多了!:)