【App designer】ある区間のデータ数を測定し、データ数の平均を出すアプリの作成について
4 次查看(过去 30 天)
显示 更早的评论
App designerにて、下記のアプリを作成していますが、上手くいきません。
アプリの詳細は下記の通りです。
<内容>
①データファイル(プログラム中 app.data)を読み込み
②データの1列目において、値が1以上立ち上がる前の位置から、
データの2列目において、値が1以上になる位置までの行数を計算
③データの全てにおいて、②を行い、平均の行数(プログラム中 ans)を算出
そこで、下記のプログラムを作成しました。
df = diff(app.data(:, 1));
idx = find(df >= 1, 1, 'first') ;
rows = zeros(1, numel(idx));
for n=1: numel(idx)
checkFlag = find(app.data(idx:end, 2) >= 1, 1, 'first') ;
if isempty(checkFlag)
checkFlag = 0;
end
rows(1, n) = checkFlag;
end
ans = mean(rows);
下記のようなデータを読み込み、結果としては赤枠で囲った部分の行数の平均(4+9)/2=6.5と出て欲しいのですが、4と算出されます。
不等号の処理が怪しいと思うのですが、解決できません。
修正点があればご教授いただけますと幸いです。
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/862765/image.jpeg)
何卒よろしくお願いいたします。
0 个评论
采纳的回答
Atsushi Ueno
2022-1-17
前回の回答のコメントを踏まえ、for文を使った方で回答します。
質問に提示されたプログラムの問題点は、find関数の2番目の引数(n — 検出する非ゼロの数)を1にしている事です。
idxはスカラ値になりfor n=1:numel(idx)としても1回しか実行されません。従って上記引数を1からinfに変更しました。
もう一つのfind関数は2番目の引数を1とし1つのみ抽出します。idxの値は複数ある可能性があるのでn番目の数値を使います。
app.data = [0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1; 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1]';
df = diff(app.data(:, 1));
idx = find(df >= 1, inf, 'first'); % 2番目の引数(n — 検出する非ゼロの数)を1からinfに変更
rows = zeros(1, numel(idx));
for n = 1:numel(idx)
checkFlag = find(app.data(idx(n):end, 2) >= 1, 1, 'first'); % こちらは1のまま
if isempty(checkFlag)
checkFlag = 0;
end
rows(1, n) = checkFlag;
end
ans = mean(rows)
更多回答(1 个)
Atsushi Ueno
2022-1-14
【プログラム例】
app.data = [0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1; 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1]';
idx = find(diff(app.data(:, 1)) >= 1, inf, 'first'); % 2番目の引数nを1からinfに変更
checkFlag = find(app.data(:, 2) >= 1, inf, 'first'); % 2番目の引数nを1からinfに変更
distance = checkFlag - idx';
distance(distance < 0) = inf;
rows = min(distance) + 1;
ans = mean(rows)
【解説】
質問に提示されたプログラムの問題点は、find関数の2番目の引数(n — 検出する非ゼロの数)を1にしている事です。
idxはスカラ値になりfor n=1:numel(idx)としても1回しか実行されません。従って上記引数を1からinfに変更しました。
またMATLABなのでfor文は使わない方向でプログラムを変更しました。
app.data = [0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1; 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1]';
app.data % ①データファイル(プログラム中 app.data)を読み込み
% ②データの1列目において、値が1以上立ち上がる前の位置、③データの全てにおいて、②を行う
idx = find(diff(app.data(:, 1)) >= 1, inf, 'first') % 2番目の引数nを1からinfに変更
% ②データの2列目において、値が1以上になる位置、③データの全てにおいて、②を行う
checkFlag = find(app.data(:, 2) >= 1, inf, 'first') % 2番目の引数nを1からinfに変更
distance = checkFlag - idx' % ここで①と②の相対距離を演算する
distance(distance < 0) = inf % 負の値は逆方向なのでinfに変更し取り扱わない
rows = min(distance) + 1 % 最も近い距離(赤枠で囲った部分の行数)を選択する
ans = mean(rows) % 距離の平均値を演算する
3 个评论
Atsushi Ueno
2022-1-17
①MATLABでfor文が好ましくない理由
for文も良いです。適材適所だと思います。
②赤枠内の平均値に加え、赤枠自体(該当箇所)の回数の導出も可能でしょうか。
size(rows(:))で導出できると思いましたが、私の仕様解釈に穴がある事に気付きました。データの1列目において値が1以上立ち上がる前の位置から、データの2列目において値が1以上になる位置までの間に、データの1列目において値が1以上立ち上がる箇所がもう一度出現した時にもそれを1区間として重複してカウントしてしまいます。
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 App Designer を使用したアプリ開発 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!