Splitting a vector at sign change

2 次查看(过去 30 天)
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
KSSV 2020-6-8
编辑:KSSV 2020-6-8
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 个评论
Stephen23
Stephen23 2020-6-8
编辑:Stephen23 2020-6-8
A simpler and more efficient approach to get the run lengths:
>> L = diff(find([1,diff(sign(K)),1]))
L =
8 8 8
Holmbrero
Holmbrero 2020-6-9
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,

请先登录,再进行评论。

更多回答(2 个)

Holmbrero
Holmbrero 2020-6-8
Works great. Thank you very much!

Kevin Joshi
Kevin Joshi 2020-6-8
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

产品


版本

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by