業特定の行の削除(ある行まで)

4 views (last 30 days)
y Ishiwata
y Ishiwata on 25 Mar 2022
Commented: y Ishiwata on 30 Mar 2022
約100000×3の以下の添付写真のような行列があります。
1列目、2列目はある画像のX,Y座標を記録しており、どちらも0と記録されている箇所もあります。
3列目は1か0が並んでおります。
やりたいこととしては、
①1行目から順番に1,2列目の数値を見ていき初めて0ではない数値(写真では(x,y)=(278,564))が出てくる行までを削除
この時、1,2列目の数値で0出ない行が出て以降の行で、0を含む行は削除しないようにしたいです
②残った行列から、3列目が0の行のみを削除
上記二つを順番に行うことを目標にしております。
matlab初心者でして、idxやfor+breakなどでも試しましたが思ったようにいかず…どのようにしたらできるのか教えていただけますでしょうか?
説明の至らない箇所がございましたらご質問ください。
よろしくお願いいたします。

Answers (1)

Hernia Baby
Hernia Baby on 25 Mar 2022
まずはデータを作ります
clc,clear;
A = zeros(50,3);
n = 20;
A(1:n+10,3) = 1;
A(n+1:end,1:2) = randi([1,30],[50-n, 2]);
A(end-5:end-2,1:2) = 0;
A(n+15:end,3) = 1
A = 50×3
0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1
条件式より最初に0じゃない場所を見つけます
idx = A(:,1:2) ~= 0;
num = find(idx);
n1 = num(1)
n1 = 21
最初から0じゃない場合も考慮して、if分を設けてます
if n1 ~= 1
A(1:n1-1,:) = []
end
A = 30×3
27 9 1 19 9 1 21 4 1 9 16 1 17 24 1 3 6 1 17 17 1 9 13 1 7 7 1 8 25 1
3列目で0がある部分を消します
idx2 = A(:,3) == 0;
A(idx2,:) = []
A = 26×3
27 9 1 19 9 1 21 4 1 9 16 1 17 24 1 3 6 1 17 17 1 9 13 1 7 7 1 8 25 1
最後の7行分を見てみましょう
disp(A(end-6:end,:))
22 16 1 0 0 1 0 0 1 0 0 1 0 0 1 10 12 1 23 25 1
0があっても消えていないことが確認できました
  1 Comment
y Ishiwata
y Ishiwata on 30 Mar 2022
お返事が遅くなってしまい申し訳ございません。
教えていただいたものでやりたいことができました。ありがとうございました。

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!