Splitting a vector at sign change

5 次查看(过去 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

类别

Help CenterFile Exchange 中查找有关 Get Started with MATLAB 的更多信息

产品


版本

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by