正の数と負の数が交互​に出現するような配列​から,各正の数エリア​と負の数エリアで絶対​値が最大である要素を​求めたい.

7 views (last 30 days)
一伯 岡本
一伯 岡本 on 10 Nov 2022
Commented: 一伯 岡本 on 15 Nov 2022
実現したいこと
[-1, -2, 4, 2, 3, -2, -4, -5, 1, 4, 6, 7]
上記のような正の数と負の数が交互に出現するような配列があった際に,各正の数エリアと負の数エリアで絶対値が最大である要素を求めたいです.
上記配列の場合下記のような配列を想定しています.
[-2, 4, -5, 7]
試したこと
グループ化変数を作成しようと思い,正負で判定したlogical配列を作成しました.(正:1,負:0)
[0, 0, 1, 1, 1, 0, 0, 0, 1, 1, ,1 ,1]
これを下記のように変換できれば,実現できるのではと考えています.
[1, 1, 2, 2, 2, 3, 3, 3, 4, 4, ,4 ,4]
1,2,,3,4への変換が可能な方,「実現したいこと」の内容が実現可能な方,どちらか片方でも構わないのでご教示いただけますと幸いです.

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 10 Nov 2022
> 「実現したいこと」の内容が実現可能な方  ハイッ (・ω・*∩
diff関数、find関数、mat2cell関数、abs関数、sign関数、cellfun関数を使いました。
x = [-1, -2, 4, 2, 3, -2, -4, -5, 1, 4, 6, 7];
bnd = [1, diff(x >= 0), 1] % 符号が変化する境界を得る(先頭と末尾も境界とする)
bnd = 1×13
1 0 1 0 0 -1 0 0 1 0 0 0 1
idx = diff(find(bnd)) % 境界のインデックスを得て「各エリアの長さ」を得る
idx = 1×4
2 3 3 4
grp = mat2cell(x(:), idx); % 各エリアを分割しセル配列にする
cellfun(@(x) max(abs(x))*sign(x(1)), grp)' % 絶対値の最大値を得て、元の数の符号をつける
ans = 1×4
-2 4 -5 7
% 上記配列の場合下記のような配列を想定しています.
% [-2, 4, -5, 7]
  1 Comment
一伯 岡本
一伯 岡本 on 15 Nov 2022
丁寧でわかりやすい回答をありがとうございます.
どちらも回答いただき大変助かりました!
「実現したいことの内容」の方の回答をBAさせていただきます.

Sign in to comment.

More Answers (1)

Atsushi Ueno
Atsushi Ueno on 10 Nov 2022
Edited: Atsushi Ueno on 10 Nov 2022
> 1,2,,3,4への変換が可能な方  ハイッ (・ω・*∩
diff関数、abs関数、cumsum関数を使いました。
零は現れないと想定し「正の数エリア」に含めました。
入力値が負⇒零⇒負と変化する様な場合は、最大値が零の「正の数エリア」が生成されます。
x = [-1, -2, 4, 2, 3, -2, -4, -5, 1, 4, 6, 7];
y_correct = [-2, 4, -5, 7];
sgn = x >= 0 % 符号情報(ゼロ以上:1,負:0)、sign関数は使用しなかった
sgn = 1×12 logical array
0 0 1 1 1 0 0 0 1 1 1 1
bnd = [1 abs(diff(sgn))] % 符号が変化する境界を得る
bnd = 1×12
1 0 1 0 0 1 0 0 1 0 0 0
area = cumsum(bnd) % 上記を累積する
area = 1×12
1 1 2 2 2 3 3 3 4 4 4 4

Categories

Find more on Matrix Indexing in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!