Splitting a vector at sign change

2 ビュー (過去 30 日間)
Holmbrero
Holmbrero 2020 年 6 月 8 日
コメント済み: Holmbrero 2020 年 6 月 9 日
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 Center および File ExchangeSmoothing and Denoising についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by