# Splitting a vector at sign change

9 views (last 30 days)
Holmbrero on 8 Jun 2020
Commented: Holmbrero on 9 Jun 2020
Hi!
I have a vector with values > 0 and values < 0 such as for example:
K = [1 2 3 4 5 6 7 8 -1 -2 -3 -4 -5 -6 -7 -8 1 2 3 4 5 6 7 8] and so on....
I want to split this vector to n new vectors where the sign changes from + to - and vice versa such that:
N1 = [1 2 3 4 5 6 7 8]
N2 = [-1 -2 -3 -4 -5 -6 -7 -8]
N3 = [1 2 3 4 5 6 7 8]
The K vector does not have a set number of positive or negative values between each sign change.
Any suggestions?
Regards

KSSV on 8 Jun 2020
Edited: KSSV on 8 Jun 2020
K = [1 2 3 4 5 6 7 8 -1 -2 -3 -4 -5 -6 -7 -8 1 2 3 4 5 6 7 8] ;
K = K' ;
S = sign(K) ;
C = mat2cell(S, diff([0; find(diff(S)); size(S,1)]));
L = cellfun(@numel,C) ;
iwant = mat2cell(K,L) ;
celldisp(iwant)
##### 2 CommentsShowHide 1 older comment
Holmbrero on 9 Jun 2020
Thanks for the input!
I have a follow up question.
I want the values from iwant as a txt. or equal with each cell as a column such that:
iwant(1) iwant(2) iwant(3)
1 -1 1
2 -2 2
3 -3 3
4 -4 4
5 -5 5
6 -6 6
7 -7 7
8 -8 8
And so on. Any suggestions?
Regards,

Holmbrero on 8 Jun 2020
Works great. Thank you very much!

Kevin Joshi on 8 Jun 2020
K = [1 2 3 ...
-1 -2 -3 ...
-1 -2 -3 -4 ...
1 2 3 4 5 6 7 8];
%%
m = 1;
n = 1;
x = 1;
y = 1;
for i = 1:length(K)
if K(i)<0
s.(['n' num2str(m)])(n) = K(i);
n = n + 1;
if (i+1) < length(K) && K(i+1) > 0
x = x + 1;
y = 1;
end
else
s.(['p' num2str(x)])(y) = K(i);
y = y + 1;
if (i+1) < length(K) && K(i+1) < 0
m = m + 1;
n = 1;
end
end
end

### Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

R2018b

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by