【App designer】あ​​る区間のデータから​、該当する区間の回数​を記録するアプリの作​成に​ついて

3 views (last 30 days)
RK
RK on 25 Jan 2022
Commented: RK on 27 Jan 2022
下記のアプリを作成しています。
①下記のようなデータファイル(プログラム中 app.data)を読み込み
②データの1列目において、値が1以上立ち上がる前の位置から、
 データの2列目において、値が1以上になる位置までの行数を計算
③データの全てにおいて、②を行い、平均の行数(プログラム中 ans)を算出(下記の場合、6.5行となる)
そこで、下記のようなプログラムを検討しています。
df = diff(app.data(:, 1));
idx = find(df >= 1, inf, 'first');
rows = zeros(1, numel(idx));
for n = 1:numel(idx)
checkFlag = find(app.data(idx(n):end, 2) >= 1, 1, 'first');
if isempty(checkFlag)
checkFlag = 0;
end
rows(1, n) = checkFlag;
end
ans = mean(rows)
上記に加え、該当する区間の回数をカウントするような処理を追加したいと考えています。
size関数などを使用することで、上記に追加する形で、修正は可能でしょうか。
よろしくお願いいたします。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 25 Jan 2022
1列目の開始地点(n番目)から数えて2列目に終了地点が見つからない場合(isempty(checkFlag))は、以降のrows(1, n)=0に設定するので、rowsの非ゼロ要素をカウントすれば目的の値が得られます。
numel(find(rows))
  4 Comments
Atsushi Ueno
Atsushi Ueno on 26 Jan 2022
2列目の終了地点までの間に1列目の値が増えるケースを追加したデータであっても、余分にカウントしなくなるロジックに変更しました。新規変数posの追加と、if文の条件変更&追加が変更点です。
app.data = [0 0 1 1 1 0 0 0 1 1 1 1 0 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');
rows = zeros(1, numel(idx));
pos = 1; % ←追加:2列目において値が1以上になるインデックス記録用
for n = 1:numel(idx)
checkFlag = find(app.data(idx(n):end, 2) >= 1, 1, 'first');
% 2列目に1以上の値が見つかった時のみ、かつ、開始位置が最後に見つかった場所より後の場合のみ
if ~isempty(checkFlag) && (idx(n) > pos)
rows(1, n) = checkFlag; % 見つかった場所のインデックスを追記する
pos = idx(n) + checkFlag - 1; % 最後に見つかったインデックスを記録する
end
end
% 平均の行数(0は条件が見つからなかったか、開始位置が重複した為平均より除く)
ans = mean(rows(rows~=0))
ans = 6.5000
sum(rows~=0) % 該当する区間の回数カウント結果
ans = 2
RK
RK on 27 Jan 2022
丁寧にご対応いただきありがとうございます。
上記、理解いたしました。

Sign in to comment.

More Answers (0)

Categories

Find more on アプリの作成 in Help Center and File Exchange

Products


Release

R2021a

Community Treasure Hunt

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

Start Hunting!