从MATLAB中的二进制向量(0,1)中选择1个值中的前n个值

从MATLAB中的二进制向量(0,1)中选择1个值中的前n个值,matlab,vector,Matlab,Vector,我有一个二进制向量,例如: 我希望保留前4个元素为“1”(用“0”替换其余元素)。在我的示例中,结果向量应为: z = [ 1 1 1 0 0 1 0 0 0 0 0 0] 任何帮助都将不胜感激。首先构造一个零向量,然后使用查找: z = false(size(x)); z(find(x, 4)) = true; 请尝试以下操作: z=x; A=find(z); z(A(5:end))=0; 这里的想法是,除了第一个n,1到0之外,对二进制向量不需要find。改用cumsum >&g

我有一个二进制向量,例如:

我希望保留前4个元素为“1”(用“0”替换其余元素)。在我的示例中,结果向量应为:

z = [ 1 1 1 0 0 1 0 0 0 0 0 0]

任何帮助都将不胜感激。

首先构造一个零向量,然后使用
查找

z = false(size(x));
z(find(x, 4)) = true;
请尝试以下操作:

z=x;
A=find(z);
z(A(5:end))=0;

这里的想法是,除了第一个n,1到0之外,对二进制向量不需要
find
。改用
cumsum

>> z = x;
>> z(cumsum( z, 2 ) > 4) = 0;

此解决方案(与基于
查找
的答案不同)可以同时处理一堆这样的二进制向量(只需验证
求和
是否在正确的维度上工作)。

双下标在MATLAB中不起作用。你需要一个中间变量。@EitanT我现在没有Matlab。但是使用
Octave
进行测试,效果很好。不确定它是否兼容。@jkshah当谈到双脚本时-matlab和octave不兼容compatible@Shai谢谢你指出这一点。因为我是Linux用户,所以我通常使用Octave。甚至
(find(z))(5:end)
都不起作用吗???@jkshah Matlab在Linux上也能很好地工作。但恐怕没有双重脚本。。。根本…:(…它仍然是
O(n)
,但效率和直观性较低:)现在你只是把问题复杂化了:)请注意,你的解决方案对矩阵也不起作用(你把索引搞砸了一点)。我冒昧地为你修好了。
>> z = x;
>> z(cumsum( z, 2 ) > 4) = 0;