我有一个简单的问题,并想知道是否有更快的方法(即一行或更少的代码行)从逻辑向量中获取最后的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]
你可以通过使用额外的参数find(指定要查找的值的数量以及从中找到它们的结尾)来创建一个简单的单行,然后获得返回的最小索引:
vec(1:(min(find(vec, lastX, 'last'))-1)) = false;
您可以使用方向标志cumsum来计算true从向量末尾开始到开头的出现次数'reverse'.如果计数大于您的期望lastX,那个元素vec应该是false:
vec(cumsum(vec, 'reverse') > lastX) = false;