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

16 visualizzazioni (ultimi 30 giorni)
龍之介
龍之介 il 12 Gen 2024
Commentato: Atsushi Ueno il 12 Gen 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にしたいと考えています。)
どのようにすれば可能か教えていただけないでしょうか。

Risposte (1)

Dyuman Joshi
Dyuman Joshi il 12 Gen 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 Commento
Atsushi Ueno
Atsushi Ueno il 12 Gen 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

Accedi per commentare.

Categorie

Scopri di più su Creating and Concatenating Matrices in Help Center e File Exchange

Prodotti


Release

R2023a

Community Treasure Hunt

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

Start Hunting!