Filter löschen
Filter löschen

MATLABを用いて二段階で範囲を指定したい場合

2 Ansichten (letzte 30 Tage)
龍之介
龍之介 am 12 Jan. 2024
Kommentiert: Atsushi Ueno am 12 Jan. 2024
レーザスキャナのデータから範囲指定したデータだけを残したいと考えています。
num=xlsread(filename,1,'H:J'); %ExcelのH列からJ列を1列目から3列目として読み込む
X = num(:,1); %1列目全行をXとする
Y = num(:,2); %2列目全行をYとする
Z = num(:,3); %3列目全行をZとする
X(20<X)=100; %20より大きいXを100とする
X(X<-20)=100; %-20未満のXを100とする
x=find(X<100); %100未満のXを探す
Y(9<Y)=-1; %9より大きいYを-1とする
Y(Y<4)=-1; %2未満のYを-1とする
y=find(Y>0); %0以上のYを探す
Z(Z<-1.0)=10; %-1.0未満のZを10とする
Z(0.1<Z)=10; %0.1より大きいZを10とする
z=find(Z<10);
[xy,iy,iz]=intersect(x,y,'rows'); %x,y共に条件を満たす行を見つける
[xyz,ixy,iz]=intersect(xy,z,'rows'); %x,y,zすべてが条件を満たす行を見つける
X=X(xyz); %条件を満たす行の1行目をXとする
Y=Y(xyz); %条件を満たす行の2行目をYとする
Z=Z(xyz); %条件を満たす行の3行目をZとする
XYZ=[X Y Z];
上のコードでX,Y,Zそれぞれを範囲指定は出来たのですが、Xの範囲のさらに一部だけZ座標を絞り込み、残りは現在の絞り込み範囲で残そうとしています。(具体的には-7.5<X<7.5の範囲だけ-0.5<Z<0.1にしたいと考えています。)
どのようにすれば可能か教えていただけないでしょうか。

Antworten (1)

Dyuman Joshi
Dyuman Joshi am 12 Jan. 2024
xlsread() is a deprecated function, it is not recommended to use. Utilise readmatrix instead.
Use logical indexing instead of find() and intersect() -
%Read the data via readmatrix()
num=readmatrix(filename,'Sheet',1,'Range','H:J'); %ExcelのH列からJ列を1列目から3列目として読み込む
X = num(:,1); %1列目全行をXとする
Y = num(:,2); %2列目全行をYとする
Z = num(:,3); %3列目全行をZとする
%Pair multiple conditions on the same array
X(20<X | X<-20)=100; %20より大きいXを100とする %-20未満のXを100とする
Y(9<Y | Y<4)=-1; %9より大きいYを-1とする %2未満のYを-1とする
Z(Z<-1.0 | 0.1<Z)=10; %-1.0未満のZを10とする %0.1より大きいZを10とする
x=(X<100); %100未満のXを探す
y=(Y>0); %0以上のYを探す
z=(Z<10);
xyz = (x & y & z);
X0=X(xyz); %条件を満たす行の1行目をXとする
Y0=Y(xyz); %条件を満たす行の2行目をYとする
Z0=Z(xyz); %条件を満たす行の3行目をZとする
XYZ=[X0 Y0 Z0];
%Narrowing the Z coordinates further
idx = xyz & (Z>-0.5 & Z<0.1) & (abs(X)<7.5)
Z_new=Z(idx);
  1 Kommentar
Atsushi Ueno
Atsushi Ueno am 12 Jan. 2024
@Dyuman Joshiさんの仰る通り、値ではなく index (添え字)を求めるには、find 関数を使わない方がわかりやすいです。(find 関数を使って index を求める事も可能です)
乱数から所定の範囲に入る行を求めてみました。
num = 60 * rand(10000,3) - 30; % 動作確認用に10000行3列の乱数(-30~30)を生成
xyz = ( -20 <= num(:,1)) & (num(:,1) <= 20) ... % 条件を満たすindex(行)を探す
& ( 4 <= num(:,2)) & (num(:,2) <= 9) ... % Yの条件が不要であれば削除する
& (-1.0 <= num(:,3)) & (num(:,3) <= 0.1);
XYZ = num(xyz,1:3)
XYZ = 6×3
13.1494 6.6128 -0.8436 -17.4690 5.8363 -0.3217 -16.3051 5.9511 -0.9167 13.8454 5.7135 -0.1852 6.4725 6.9901 -0.9410 -15.2736 6.5408 -0.5078

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Statistics and Machine Learning Toolbox finden Sie in Help Center und File Exchange

Produkte


Version

R2023a

Community Treasure Hunt

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

Start Hunting!