find関数とfor​関数をもちいた全デー​タの取得について

조회 수: 11 (최근 30일)
ryu
ryu 2022년 2월 28일
댓글: kohta 2023년 11월 9일
find関数とfor関数を用いて以下のような計算を行いたいです(重心動揺外周面積の計算)
ちなみにデータは重心動揺計のデータでx軸とy軸のデータがあります
theta = mod(atan2d(X,Y)+360,360) ;
X(x軸方向のデータ),Y(y軸方向のデータ)に対して原点からの角度thetaを求めました。
for i = 0 :3: 360 ; %3°ずつずらす
a = find(theta > i & theta < i+3) ; %i<theta<i+3の範囲にあるデータ数を抽出
end
その後上記のようにfind関数を使用して0から3°ずつ範囲を移動(合計120区間=360°/3°)させてその範囲内のデータをaに取得していきたいです。
しかしfindで抽出されるデータ数がそれぞれの区間によって異なるためaに代入することができません。
(ex.0-3°の範囲ではデータ数10個,3-6°の範囲ではデータ数15個→aに代入できない)
このようにデータ数が違うものをforを使用して取得する方法はございますでしょうか。
またもっといい方法がございましたら教えていただいたいです。
  댓글 수: 1
kohta
kohta 2023년 11월 9일
現在、私も外周面積の求め方を作成していまして、疑問点についてコメントさせていただきます。 範囲内のデータの個数をaに抽出するように書かれているのですが、その後どのような処理をして外周面積を求めるのでしょうか。 返信いただけたら幸いです。

댓글을 달려면 로그인하십시오.

채택된 답변

Hernia Baby
Hernia Baby 2022년 2월 28일
cell配列 に格納してください
for ii = 1:10
a{ii} = randi(10,ii,ii);
end
a
a = 1×10 cell array
{[8]} {2×2 double} {3×3 double} {4×4 double} {5×5 double} {6×6 double} {7×7 double} {8×8 double} {9×9 double} {10×10 double}
cellfunを用いて一気にそれぞれの要素サイズを見ていきます。
cellfun(@size,a,'UniformOutput',false)
ans = 1×10 cell array
{[1 1]} {[2 2]} {[3 3]} {[4 4]} {[5 5]} {[6 6]} {[7 7]} {[8 8]} {[9 9]} {[10 10]}
サイズが異なるものが格納できました
  댓글 수: 2
Atsushi Ueno
Atsushi Ueno 2022년 3월 1일
回答(セル配列)を質問と同じ状況に適用するとこんな感じです。
X = rand(10000,1)*2-1; % X: -1.0~1.0の乱数10000個
Y = rand(10000,1)*2-1; % Y: -1.0~1.0の乱数10000個
theta = mod(atan2d(X,Y)+360,360);
for i = 0:3:360 % 3°ずつずらす
a{i/3+1} = find(theta > i & theta < i+3); % i<theta<i+3の範囲にあるデータ数を抽出
end
b = cellfun(@numel,a) % cellfunを用いて一気にそれぞれの要素サイズを見ていきます
b = 1×121
63 61 65 68 73 84 76 69 83 78 110 93 120 130 104 105 98 107 100 89 97 74 79 71 68 74 73 57 61 65
bar(b); % それぞれの区間によって異なる「findで抽出されるデータ数」を棒グラフで表示
xticklabels({'0','60','120','180','240','300','360'});
これと同じ事をするMATLAB関数があります。
ryu
ryu 2022년 3월 1일
非常にわかりやすい説明ありがとうございます。
無事にプログラムを完成させることができました。

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Atsushi Ueno
Atsushi Ueno 2022년 3월 1일
X = rand(10000,1)*2-1; % X: -1.0~1.0の乱数10000個
Y = rand(10000,1)*2-1; % Y: -1.0~1.0の乱数10000個
theta = mod(atan2d(X,Y)+360,360);
[N,edges] = histcounts(theta, 0:3:360)
N = 1×120
58 71 58 54 57 89 56 85 70 97 90 103 82 103 139 136 137 109 106 91 86 75 65 75 85 71 68 64 45 53
edges = 1×121
0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87
histogram(theta, 0:3:360);
  댓글 수: 1
ryu
ryu 2022년 3월 1일
このような関数があるとは知りませんでした。
ありがとうございます。使用したいと思います。

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

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

Start Hunting!