【App designer】あ​る区間のデータ数を測​定し、データ数の平均​を出すアプリの作成に​ついて

5 ビュー (過去 30 日間)
RK
RK 2022 年 1 月 14 日
コメント済み: RK 2022 年 1 月 18 日
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と算出されます。
不等号の処理が怪しいと思うのですが、解決できません。
修正点があればご教授いただけますと幸いです。
何卒よろしくお願いいたします。

採用された回答

Atsushi Ueno
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)
ans = 6.5000
  1 件のコメント
RK
RK 2022 年 1 月 18 日
ありがとうございます。
上記の場合であれば、size(rows(:))により、回数の導出も可能でしょうか。
問題がある場合、別途新たな質問として作成いたします。
よろしくお願いいたします。

サインインしてコメントする。

その他の回答 (1 件)

Atsushi Ueno
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)
ans = 6.5000
【解説】
質問に提示されたプログラムの問題点は、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)を読み込み
ans = 16×2
0 0 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0
% ②データの1列目において、値が1以上立ち上がる前の位置、③データの全てにおいて、②を行う
idx = find(diff(app.data(:, 1)) >= 1, inf, 'first') % 2番目の引数nを1からinfに変更
idx = 2×1
2 8
% ②データの2列目において、値が1以上になる位置、③データの全てにおいて、②を行う
checkFlag = find(app.data(:, 2) >= 1, inf, 'first') % 2番目の引数nを1からinfに変更
checkFlag = 4×1
5 6 7 16
distance = checkFlag - idx' % ここで①と②の相対距離を演算する
distance = 4×2
3 -3 4 -2 5 -1 14 8
distance(distance < 0) = inf % 負の値は逆方向なのでinfに変更し取り扱わない
distance = 4×2
3 Inf 4 Inf 5 Inf 14 8
rows = min(distance) + 1 % 最も近い距離(赤枠で囲った部分の行数)を選択する
rows = 1×2
4 9
ans = mean(rows) % 距離の平均値を演算する
ans = 6.5000
  3 件のコメント
RK
RK 2022 年 1 月 18 日
上記、回答いただききありがとうございます。
承知いたしました。

サインインしてコメントする。

製品


リリース

R2021a

Community Treasure Hunt

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

Start Hunting!