一つの列の中の任意の​範囲内に正と負の値が​両方がある場合に、そ​の範囲内の値を0に置​換するにはどうしたら​よいですか。

一つの列の中の任意の範囲内に、正と負の値が両方ある場合にその範囲名の値を0に置換する方法を教えていただきたいです。
1,2,-3,4,5,6,7,8,9という要素があるとして、上記における任意の範囲を3としたときに、
0,0,0,4,5,6,7,8,9となるようなイメージです。
私はmatlabを使い始めたばかりで、このようなソフトウェアにもあまり触れてきていなかったため知識が乏しいです。
ご助力お願いいたします。

1 Kommentar

Walter Roberson
Walter Roberson am 13 Okt. 2021
Approximate translation:
I would like to know how to replace the value of the range name with 0 when there are both positive and negative values in an arbitrary range in one column.Assuming that there are elements 1,2,-3,4,5,6,7,8,9, when the arbitrary range in the above is set to 3,It is an image that becomes 0,0,0,4,5,6,7,8,9.I'm new to matlab and haven't had much knowledge of such software.Thank you for your help.

Melden Sie sich an, um zu kommentieren.

Antworten (3)

Hernia Baby
Hernia Baby am 13 Okt. 2021
Bearbeitet: Hernia Baby am 13 Okt. 2021

1 Stimme

質問の内容理解しましたので編集します
n = 4;
A = [1,2,-3,4,5,6,7,8,9];
負の値がある場合は1を返します
idx = A < 0
idx = 1×9 logical array
0 0 1 0 0 0 0 0 0
正と負がn=4の中に混在しているかを判定します
混在している場合は4番目までの数字は0になります
idx = idx(1:n)
idx = 1×4 logical array
0 0 1 0
if sum(idx)>=1 & sum(idx) < n
A(1:n) = 0;
end
A
A = 1×9
0 0 0 0 5 6 7 8 9

4 Kommentare

Hernia Baby
Hernia Baby am 13 Okt. 2021
まず正負判定なので小数点か否かは関係ありません。なので実行可です。
範囲窓をスライディングするので複雑なものになります。
窓の大きさ3として以下やっていきます
小数点以下4桁を出すおまじないをします
format shortG
w = 3;
A = [1,2,-3,4,5.5,6.4,-7,8,9,10]
A = 1×10
1.0000 2.0000 -3.0000 4.0000 5.5000 6.4000 -7.0000 8.0000 9.0000 10.0000
各範囲内でブロックを作ります
その中で正負が混じった場合に 0 を返します
num = length(A) - w + 1;
for i = 1:num
x = A(i:i+w-1);
if sum(x<0)*sum(x>=0)>0
x = zeros(1,w);
end
X{i} = x;
end
X
X = 1×8 cell array
{[0 0 0]} {[0 0 0]} {[0 0 0]} {[4 5.5 6.4]} {[0 0 0]} {[0 0 0]} {[0 0 0]} {[8 9 10]}
Bを作成し、各ブロックを連結させていきます
B = X{1};
for i = 2:length(X)
x = X{i};
x1 = x(1:w-1); % i = 2では x1 = [0, 0] ([2,-3]の部分に該当)
x2 = x(end); % i = 2では x2 = [0] ([4]の部分に該当)
idx = B(end-w+2:end) == x1; % Bの後ろから1番目~最後の列とx1の数字が同じか判定
x1(idx) = 0; % 同じ場合は0にする
x1 = [zeros(1,length(B)-w+1),x1]; % x1をBと同じ大きさにして足し、最後の列にx2をくっつける
B = [B+x1,x2];
end
B
B = 1×10
0 0 0 4.0000 5.5000 6.4000 0 8.0000 9.0000 10.0000
snake
snake am 14 Okt. 2021
詳しい解説、コードともに勉強になります。
また、質問サイトの使い方も教えていただきありがとうございます。
実際に自分で試して上手く動作させることができました。
そこで今後のために、Excelの数値をインポートしたものに対して実行してみた結果、二つのエラーメッセージが表示されてしまいました。
・エラー: horzcat
 連結する配列の次元が一致しません。
・エラー: tikan (行 21)     ※tikanはスクリプトの名前です。
 x1 = [zeros(1,length(B)-w+1),x1]; % x1をBと同じ大きさにして足し、最後の列にx2をくっつける
各エラーについて調べてみても原因がよくわかりませんでした。
どうしたらきちんと実行することができますでしょうか。
質問ばかりで申し訳ありませんがご教授お願い致します。
Hernia Baby
Hernia Baby am 14 Okt. 2021
行ベクトルでなくて列ベクトル を扱っているからですね
見てみましょうか
w = 3;
A = [1,2,-3,4,5,6,-7,8,9,10]'
A = 10×1
1 2 -3 4 5 6 -7 8 9 10
これが列ベクトルですね
この場合連結する方向が違います
horzcatvertcat を参照ください
num = length(A) - w + 1;
for i = 1:num
x = A(i:i+w-1);
if sum(x<0)*sum(x>=0)>0
x = zeros(w,1); %ここを列ベクトルにした
end
X{i} = x;
end
X
X = 1×8 cell array
{3×1 double} {3×1 double} {3×1 double} {3×1 double} {3×1 double} {3×1 double} {3×1 double} {3×1 double}
列ベクトルを並べているのがわかりますね
では連結していきましょう
B = X{1};
for i = 2:length(X)
x = X{i};
x1 = x(1:w-1);
x2 = x(end);
idx = B(end-w+2:end) == x1;
x1(idx) = 0;
x1 = [zeros(length(B)-w+1,1);x1]; %ここを列ベクトルにした
B = [B+x1;x2]; %ここを列ベクトルとして結合
end
B
B = 10×1
0 0 0 4 5 6 0 8 9 10
snake
snake am 14 Okt. 2021
そういうことだったのですね。
行ベクトルと列ベクトル、しっかりと覚えました。
様々なことを丁寧に教えていただき、本当にありがとうございました。
自分なりに調べたり試行錯誤しても分からないことだらけで、学校の先生に聞いても自分でなんとかしての一点張りで、心が折れそうなところを助けていただきました。
改めて、このたびは本当にありがとうございました。
失礼いたします。

Melden Sie sich an, um zu kommentieren.

Walter Roberson
Walter Roberson am 13 Okt. 2021

0 Stimmen

range = 3;
A = [1,2,-3,4,5,6,7,8,9]
A = 1×9
1 2 -3 4 5 6 7 8 9
A(A < range) = 0
A = 1×9
0 0 0 4 5 6 7 8 9

3 Kommentare

snake
snake am 13 Okt. 2021
質問に回答していただきありがとうございます。
A = [1,2,-3,-4,-5,6,9,-3,4,5,6,7,8,9]
range = 4;
A(A < range)=0
このように記述すると、
A =
1 2 -3 -4 -5 6 9 -3 4 5 6 7 8 9
A =
0 0 0 0 0 6 9 0 4 5 6 7 8 9
となるのですが、6と9はなぜ0に置換されないのでしょうか。
回答していただけるとありがたいです。
Hernia Baby
Hernia Baby am 13 Okt. 2021
これは何をしてるかというと range という数字より下のものを 0 としているからです。
6と9は 4 以上なので 0 に置換されません。
snake
snake am 13 Okt. 2021
そうだったのですね。
コメントありがとうございます。

Melden Sie sich an, um zu kommentieren.

snake
snake am 13 Okt. 2021

0 Stimmen

わかりやすい回答ありがとうございます。
「範囲内に~」の範囲をずらしていくことは可能なのでしょうか。
文章での説明が難しいため、図を添付しますのでそちらを見ていただけると有難いです。
また、これらの数値は小数でも実行することはできるでしょうか。
見当違いなことを言っていましたら申し訳ありません。
何卒宜しくお願い致します。

1 Kommentar

Hernia Baby
Hernia Baby am 13 Okt. 2021
自分のコメントに追加しました
以下は余談です
・全員に追記を展開する場合は質問部で編集すると周りも認知しやすくなります
・個人に対する返答ではコメントに記述すると、その人に通知が来るのでFBが来やすいです

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu 文字と文字列 finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2021b

Gefragt:

am 13 Okt. 2021

Kommentiert:

am 14 Okt. 2021

Community Treasure Hunt

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

Start Hunting!