【发布时间】:2021-05-25 09:44:20
【问题描述】:
我正在寻找算法(有效 + 向量化)如何通过以下方式找到间隙 (NaN) 宽度的直方图:
- 信号由 (Nsamples x Nsig) 数组表示
- 信号中的间隙由 NaN 编码
- 间隙宽度:是信号中连续 NaN 的数量
- 间隙宽度直方图:是信号中具有特定宽度的间隙的频率
并且满足以下条件:
[Nsamples,Nsig ]= size(signals)
isequal(size(signals),size(gapwidthhist)) % true
isequal(sum(gapwidthhist.*(1:Nsamples)',1),sum(isnan(signals),1)) % true
当然,gapwidthhist 的压缩形式(由两个单元格表示:“gapwidthhist_compressed_widths”和“gapwidthhist_compressed_freqs”)也是必需的。
例子:
signals = [1.1 NaN NaN NaN -1.4 NaN 8.3 NaN NaN NaN NaN 1.5 NaN NaN; % signal No. 1
NaN 2.2 NaN 4.9 NaN 8.2 NaN NaN NaN NaN NaN 2.4 NaN NaN]' % signal No. 2
gapwidthhist = [1 1 1 1 0 0 0 0 0 0 0 0 0 0; % gap histogram for signal No. 1
3 1 0 0 1 0 0 0 0 0 0 0 0 0]' % gap histogram for signal No. 2
其中整数直方图 bin(间隙宽度)为 1:Nsamples (Nsamples=14)。
对应的压缩间隙直方图如下所示:
gapwidthhist_compressed_widths = cell(1,Nsig)
gapwidthhist_compressed_widths =
1×2 cell array
{[1 2 3 4]} {[1 2 5]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
gapwidthhist_compressed_freqs = cell(1, Nsig)
gapwidthhist_compressed_freqs =
1×2 cell array
{[1 1 1 1]} {[3 1 1]}
典型问题维度:
Nsamples = 1e5 - 1e6
Nsig = 1e2 - 1e3.
提前感谢您的帮助。
添加备注:我目前最好的解决方案是以下代码:
signals = [1.1 NaN NaN NaN -1.4 NaN 8.3 NaN NaN NaN NaN 1.5 NaN NaN; % signal No. 1
NaN 2.2 NaN 4.9 NaN 8.2 NaN NaN NaN NaN NaN 2.4 NaN NaN; % signal No. 2
1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN]' % signal No. 3
[numData, numSignals] = size(signals)
gapwidthhist = zeros(numData, numSignals);
for column = 1 : numSignals
thisSignal = signals(:, column); % Extract this column.
% Find lengths of all NAN runs
props = regionprops(isnan(thisSignal), 'Area');
allLengths = [props.Area]
edges = [1:max(allLengths), inf]
hc = histcounts(allLengths, edges)
% Load up gapwidthhist
for k2 = 1 : length(hc)
gapwidthhist(k2, column) = hc(k2);
end
end
% What it is:
gapwidthhist'
但我主要在寻找没有任何内置 matlab 函数的纯 Matlab 代码(如 Image Processing Toolbox 中的“regionprops”)!!!
【问题讨论】:
-
为什么不循环遍历列的元素;如果元素是 NaN,则增加一个计数器;如果元素不是 NaN,则保存计数并重置计数器。
-
@beaker 你能详细说明你的方法吗?