【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と算出されます。
不等号の処理が怪しいと思うのですが、解決できません。
修正点があればご教授いただけますと幸いです。
何卒よろしくお願いいたします。
댓글 수: 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!