在值为

时间:2015-05-04 06:11:31

标签: arrays matlab vectorization

我正在为这个问题寻找一个矢量化解决方案: 让A向量(大尺寸:> 10000)为0和1。

前:

A = [0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1 etc]

我想将1(奇数级别)之间的0替换为2 即生产:

B = [0 0 0 1 2 2 2 2 2 1 0 0 0 1 2 2 1 0 0 1 2 1 etc]

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

使用cumsummod

可以非常轻松地完成
A = [0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 1 0 1]

简短回答

A( mod(cumsum(A),2) & ~A ) = 2
A =   
     0   0   0   1   2   2   2   2   2   1   0   0   0   1   2   2   1   0   0   1   2   1

您要求填充奇数级的岛屿,但是通过将mod(...更改为~mod(...,您可以轻松填充甚至等级的岛屿>

解释/旧答案:

mask1 = logical(A);
mask2 = logical(mod(cumsum(A),2))

out = zeros(size(A));
out(mask2) = 2
out(mask1) = 1

答案 1 :(得分:2)

尝试使用cumsum

cs = cumsum( A );
B = 2*( mod(cs,2)== 1 );
B(A==1) = 1;