正の数と負の数が交互に出現するような配列から,各正の数エリアと負の数エリアで絶対値が最大である要素を求めたい.
4 ビュー (過去 30 日間)
古いコメントを表示
実現したいこと
[-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への変換が可能な方,「実現したいこと」の内容が実現可能な方,どちらか片方でも構わないのでご教示いただけますと幸いです.
0 件のコメント
採用された回答
Atsushi Ueno
2022 年 11 月 10 日
> 「実現したいこと」の内容が実現可能な方 ハイッ (・ω・*∩
x = [-1, -2, 4, 2, 3, -2, -4, -5, 1, 4, 6, 7];
bnd = [1, diff(x >= 0), 1] % 符号が変化する境界を得る(先頭と末尾も境界とする)
idx = diff(find(bnd)) % 境界のインデックスを得て「各エリアの長さ」を得る
grp = mat2cell(x(:), idx); % 各エリアを分割しセル配列にする
cellfun(@(x) max(abs(x))*sign(x(1)), grp)' % 絶対値の最大値を得て、元の数の符号をつける
% 上記配列の場合下記のような配列を想定しています.
% [-2, 4, -5, 7]
その他の回答 (1 件)
Atsushi Ueno
2022 年 11 月 10 日
編集済み: Atsushi Ueno
2022 年 11 月 10 日
> 1,2,,3,4への変換が可能な方 ハイッ (・ω・*∩
零は現れないと想定し「正の数エリア」に含めました。
入力値が負⇒零⇒負と変化する様な場合は、最大値が零の「正の数エリア」が生成されます。
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関数は使用しなかった
bnd = [1 abs(diff(sgn))] % 符号が変化する境界を得る
area = cumsum(bnd) % 上記を累積する
0 件のコメント
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!