【App designer】ある区間のデータから、該当する区間の回数を記録するアプリの作成について
3 views (last 30 days)
Show older comments
下記のアプリを作成しています。
①下記のようなデータファイル(プログラム中 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関数などを使用することで、上記に追加する形で、修正は可能でしょうか。
よろしくお願いいたします。
0 Comments
Accepted Answer
Atsushi Ueno
on 25 Jan 2022
1列目の開始地点(n番目)から数えて2列目に終了地点が見つからない場合(isempty(checkFlag))は、以降のrows(1, n)=0に設定するので、rowsの非ゼロ要素をカウントすれば目的の値が得られます。
numel(find(rows))
4 Comments
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))
sum(rows~=0) % 該当する区間の回数カウント結果
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!