Trouble Understanding Sliding Window для столбца матрицы, общий и частный случай в Matlab

Я noob, и я нашел очень фрагментированную информацию о стеке в Slinding Window.

У меня есть матрица mXn, где m фиксировано (широта, долгота, топор, ay, az), n может отличаться от разных журналов.

1) Как создать скользящее окно только для az, не извлекая вектор и не анализируя его?

2) Если я хочу сохранить все строки, в которых стандартное отклонение z превышает определенные пороговые значения, как я могу это сделать?

3) Если длина логов не фиксирована, как я могу справиться с этим? (например, один файл содержит 932 строки, другой 953)

4) Я читаю много вопросов, я изучаю, как bsxfun работает в этом случае, но мне очень непонятно ( в этих примерах я только не понял, что создается новая матрица на основе размера окна, а затем анализируется новая матрица).)(последний вопрос тесно связан с моим опытом работы инженером-строителем)


Вот что я узнал и попытался собрать.

Скользящее окно - это мощный инструмент, позволяющий анализировать сигнал или изображение. Когда я попытался описать своей девушке, что я делал, я объяснил: "Это похоже на чтение книги с лупой, у лупы определенное измерение, и вы анализируете текст"

Раздвижное окно

Основной способ на Matlab, не самый эффективный, сделать это

1. Определите ваши векторные размеры

2. Определите размер вашего окна

3. Определите количество шагов

Вот основной пример, который я написал

a= randi(100,[1,50]);        %Generic Vector
win_dim=3;                   %Generic window size

num_stps=(length(a)-win_dim) %number of "slides", we need to subtract win_dim to avoid that the window will go over the signal 
threshold=  15 %Generic number only for the example
for i= 1:num_stps
    mean_win(i)=mean(a(i:i+win_dim -1); %we subtract 1 or we make an error, and the code analyzes a segment bigger than one unit 
    std_win(i)=std( a(i:i+win_dim -1);  %example for i=2 if we don't subtract 1 our segment starts from 2 until 5, so we analyze 
                                        % 2 3 4 5, but we defined a window dimension of 3
    If std_win(i)> threshold
    std_anomalies=std_win(i)             %here i think there is an error                                
end     

Таким образом, код перемещается по всему сигналу, но окна будут перекрываться.

Как определить "коэффициент перекрытия" (или приращение слайда)?

Мы можем определить это как "сколько информации разделяют два смежных окна?" Полусегментное перекрытие Следующий пример, который я сделал, полностью неверен, но я пытался что-то кодировать перед тем, как задавать вопрос, целью было бы перекрытие половины сегмента или отсутствие перекрытия

%Half segment overlap

a= randi(100,[1,20]); %Generic Vector
win_dim=4;  %generic window size    
%v is the increment vector in our case we desire to have 50% of overlap 
l= win_dim
if  l%2==0
    v=l/2
else 
    v=(l+1)/2
end     

for i= 1:num_stps
    if (i==1)
    mean_win(i)=mean(a(1:1+win_dim -1);
    else 
    mean(i)= mean(a (i+v:i+win_dim+v-1);
end

1 ответ

Решение

Мне нравится креативный подход к вопросу!:) Это то, что вы ищете?

a = rand(100, 5); % the data

window_size = 5; % size of the window
overlap = 2; % desired overlap
step = window_size - overlap; % compute the step

threshold = 0.3; % large std threshold

std_vals = NaN(size(a, 1), 1);
for i=1:step:(size(a, 1) - window_size)
    std_vals(i) = std(a(i:(i+window_size-1),5)); % calculate std of 5th col
end

% finding the rows with standard deviation larger than threshold
large_indexes = find(std_vals>threshold);

large_indexes даст вам начальный ряд окон, которые имеют стандартные отклонения, превышающие порог. std_vals будет хранить все стандартные отклонения для вас, на случай, если вам это понадобится позже.

Если вы хотите, чтобы индексы всех строк в окне удовлетворяли вашему порогу, вы можете добавить это в конце

large_windows = zeros(numel(large_indexes), window_size);
for i=1:window_size
    large_windows(:,i) = large_indexes + i - 1;
end

где каждый ряд large_windows дает индексы строк в окне.

Другие вопросы по тегам