Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 获取逻辑向量中的最后x项(为真)_Matlab - Fatal编程技术网

Matlab 获取逻辑向量中的最后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

我有一个简单的问题,我想知道是否有一种更快的方法(即一行或更少的代码行)从逻辑向量中获取最后的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 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来说,字符也太多了!:)