找到包含1的下一行的行数

1次查看(最近30天)
andyc100
andyc100 8月27日2020
我有一个1和0的列向量,我想找到下一行包含1的行数。例如:
A = [0 0 0 1 0 1 1 1 1 0 0 0 0 1]';
我想要回密码
B=[3 2 1 0 0 0 5 4 3 2 1 0];
有没有一种矢量化的方法可以做到这一点?
谢谢提前
10评论
卢布鲁诺
卢布鲁诺 8月28日
由于我对for循环的性能有点惊讶(我认为它很好,但不是那么好),然后我尝试看看它与MEX实现的距离有多远。我震惊了,它几乎一样快(更小的数组更快)。
t里克= 0.651531 [s]
t布鲁诺=0.379362[s]
t史蒂芬= 0.104442 [s]
t墨西哥=0.073168[s]
代码(benchmark+Cmex)在attacheh文件中,供那些想玩的人使用。
我必须祝贺TMW多年来对for循环性能的改进。

登录以发表评论。

公认的答案

里克
里克 8月27日2020
编辑:里克 8月27日2020
这需要一些时间,但这里有一个解决方案,也适用于大型矩阵。
clc,清晰
格式紧凑的
A = [0 0 0 1 0 1 1 1 1 0 0 0 0 1]';
% 3 2 1 0 1 0 0 0 5 4 3 2 1 0
B =一个;
垫= B(结束)~ = 1;
如果垫,B(终端+ 1)= 1;结束%此方法要求最后一个位置为1
B=flipud(B);
C=零(尺寸(B));
C (B = = 1) = [0; diff(找到(B)));
C = 1(大小(B)) - C;
= cumsum (C) 1;
= flipud(出);
如果外焊盘(端)=[];结束
%显示:
[答:]
4评论
andyc100
andyc100 8月27日2020
这对我来说不是一个问题,因为在我的实现中总是会有1。我想,在运行代码之前,总是可以检查向量中不是所有的零。

登录以发表评论。

更多的答案(3)

齐彬彬
齐彬彬 8月27日2020
A = [0 0 0 1 0 1 1 1 1 0 0 0 0 1]';
C =找到(A);
D=(1:长度(A))-C;
D(D>0) = D(D>0) + inf';
min (abs (D))”
ans =
3.
2
1
0
1
0
0
0
5
4
3.
2
1
0
6个评论

登录以发表评论。


卢布鲁诺
卢布鲁诺 8月27日2020
编辑:卢布鲁诺 8月27日2020
虽然我很喜欢矢量化,但这个问题是一个典型的例子,for循环方法更容易、更快、更可读。
这段代码为2D数组做好了准备,它沿着第一个维度独立工作。
兰德(30000、1000)= > 0.7;
抽搐
Al=逻辑(A);
B = 0(大小(A));
b=b(1,:);
B k =大小(1):1:1
b = b + 1;
b (Al (k,:)) = 0;
: B (k) = B;
结束
toc
1评论
andyc100
andyc100 8月27日2020
谢谢你,伯诺。这实际上也非常快,我喜欢它适用于多个列。如果我最终需要多个列,我可能会使用它。

登录以发表评论。


卢布鲁诺
卢布鲁诺 8月28日
编辑:卢布鲁诺 8月28日
现在我发现CUMSUM有方向选项,这是基于Rik的CUMSUM方法,但避免了双重翻转。
B=个(尺寸(A));
i1 =找到(A);
B (i1) = 1-diff ([i1;大小(,1)+ 1]);
B = cumsum (B,“反向”);
1评论
里克
里克 8月28日
酷,我不记得还有这个选项。事实证明,早在R2015a之前,这就已经是一个选项了。的 发行说明 不再允许您回顾R2015a之外的内容,即使您尝试修改url。我所知道的是,在R2011a中这是不可能的。

登录以发表评论。

标签

s manbetx 845


释放

R2015a

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!