2016-04-29 77 views
1

在Matlab中,我有一个大小为30x1的矢量A和另一个大小为3x1的矢量B循环重新分配向量元素matlab

A = [1.23 2.2 3.3 4.8 5.1 6.7 7.1 8.2 9.9 10.25 11.00 12.1 13.2 14.3 15.4 16.5 17.5 18.1 19.8 20.188 21.2 22.4 23.6 24.1 25.2 26.7 27.8 28.2 29.1 30.3]'; 

    B = [1.23 10.25 20.188]; 

我想从A创建相同的尺寸A的向量CB使得

C = [2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2]'; 

B的数字是倍是完全相同的作为元素在A,一些元素分开,例如B(2)=A(10)

现在我需要为A写入2到C编写一个循环,使得每次循环看到了B相同数量,直到它找到的B下一个元素是一样的A它会接着写直到找到下一个相同的元素。

因此对于例如

B(1) = 1.23 and A(1) = 1.23 so C(1:i,1)=2; %where i is the index of the 
next similar element. 

任何人都可以帮助我如何写这个循环吗?我需要使循环一般,所以不要假定任何关于相同元素的位置在哪里或可能是什么,因为我可以有不同大小的向量(当我需要稍后在脚本中实现时)。

谢谢!

+0

在两个向量的值总是会被​​上升? – excaza

+0

“A”的第一个值始终是“B”的第一个值吗? – excaza

+0

'B'的值是否总是在'A'中? – excaza

回答

4

您可以从查找索引开始。请尝试以下操作:

locs = find(ismember(A, B)) % This will give you the required indices 
N = numel(locs); 

% Pre-allocate the C vector 
C = zeros(size(A)); 
L = numel(C); 

if ~mod(N, 2) 
    C(locs(N):L) = 1; 
else 
    C(locs(N):L) = 2; 
end 

% Now start the loop 
for i = 1:N-1 
    if ~mod(i,2) 
     C(locs(i):locs(i+1)-1) = 1; 
    else 
     C(locs(i):locs(i+1)-1) = 2; 
    end 
end 

希望这有助于。您可以添加错误处理并找到缩短代码的方法。

+0

谢谢!有用!!过了一段时间后,我意识到在我的数据元素A和B有时不是100% A的一个元素可以是19.14和B 19.21,但是我找到了一种方法在给定的“容差”内找到成员,然后使用此代码! 'TOL = 0.5; ind = any(squeeze(all(abs(bsxfun(@minus,B,permute(A,[3 2 1])))<= tol,2)),1)'; j = 1;对于i = 1:大小(A)if ind(i)== 1; IND3(J)= I;当J = J + 1;结束; I = I + 1;结束 IND3 = IND3'; locs = IND3;' –

1

怎么样量化的一行:

mod(cumsum(ismember(A,B)),2)+1 

无需环路就这一个

+0

我认为这个人需要在循环中写这个,否则这就是应该如何完成的。 +1 – Amal