find関数とfor関数をもちいた全データの取得について
10 次查看(过去 30 天)
显示 更早的评论
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
2023-11-9
現在、私も外周面積の求め方を作成していまして、疑問点についてコメントさせていただきます。 範囲内のデータの個数をaに抽出するように書かれているのですが、その後どのような処理をして外周面積を求めるのでしょうか。 返信いただけたら幸いです。
采纳的回答
Hernia Baby
2022-2-28
cell配列 に格納してください
for ii = 1:10
a{ii} = randi(10,ii,ii);
end
a
cellfunを用いて一気にそれぞれの要素サイズを見ていきます。
cellfun(@size,a,'UniformOutput',false)
サイズが異なるものが格納できました
2 个评论
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を用いて一気にそれぞれの要素サイズを見ていきます
bar(b); % それぞれの区間によって異なる「findで抽出されるデータ数」を棒グラフで表示
xticklabels({'0','60','120','180','240','300','360'});
これと同じ事をするMATLAB関数があります。
更多回答(1 个)
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)
histogram(theta, 0:3:360);
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Bar Plots 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!