Извлеките определенное количество выборок слева направо с учетом индексной точки сигнала в Matlab

Имеется матрица Idx = [1xM] с размерностью M порядковых номеров извлекаемого сигнала. Для каждого номера индекса слева направо должно быть извлечено определенное количество выборок, чтобы сформировать новый субсигнал исходного сигнала. Например, 3 образца слева и 4 образца справа от порядкового номера см. ниже:

[idx-3:idx+4]

[New_Sig] становится однострочной матрицей, а не той же размерностью индексного числа из индексной матрицы [Idx]

Fs = 500; %Frequency:500
StartIdx = 0.150 * Fs;
EndIdx = 0.500 * Fs;

[Idx] = [.....];
[New_Sig] = [Idx-StartIdx : Idx+EndIdx];

Вот пример для две индексные точки из матрицы Idx ниже:

[Idx] = [2 19 23 43 48 52 62 74 78 79 81]
old_sig = [-2 0 1 2 5 6 7 8 10 19 20 21 22 23 24 25 ...]

if # of sample from left = 3, # of sample from right = 4:

a_new_sub = [-2 0 1 **2** 5 6 7 8]
b_new_sub = [7 8 10 **19** 20 21 22 23]
.....

Я вижу, вы привыкли писать посты, а не вопросы. Вопросы в английском языке — это предложения, на которые можно получить ответ и которые заканчиваются знаком вопроса, ?. Поскольку Stack Overflow является сайтом вопрос и ответов, размещение вопроса является обязательным. Причина этого в том, что иначе сложно понять, в чем именно вы хотите, чтобы мы вам помогли. Пожалуйста, возьмите тур и прочитайте Как спросить, затем редактировать свои сообщения, чтобы они содержали конкретный вопрос.

Adriaan 22.05.2019 12:26
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот мое предложение по решению этой проблемы:

StartIdx = 3;
EndIdx = 4;

Idx = [2 19 23];
old_sig = [-2 0 1 2 5 6 7 8 10 19 20 21 22 23 24 25 26 27 28 29];

% Get number of "indices".
nIdx = numel(Idx);

% Find actual indices.
idx = ceil(find(repmat(old_sig, nIdx, 1) == repmat(Idx', 1, numel(old_sig))) / nIdx);

% Set up correct (index) ranges to access in old_sig.
idx = repmat(-StartIdx:EndIdx, nIdx, 1) + repmat(idx, 1, (StartIdx + EndIdx + 1));

% Determine output.
new_sig = old_sig(idx)

На выходе получаем:

new_sig =
   -2    0    1    2    5    6    7    8
    7    8   10   19   20   21   22   23
   20   21   22   23   24   25   26   27

Предупреждение: на данный момент ваш old_sig содержит уникальные значения. Следовательно, find найдет правильный (уникальный) индекс. Если значения в вашем сигнале повторяются, необходимо указать, какое значение следует найти.

Еще одно предостережение: в зависимости от того, насколько велик ваш сигнал old_sig и сколько у вас индексов в Idx, этот подход может потребовать интенсивного использования памяти.

Старый сигнал представляет собой матрицу [1x10000], а индексы были [1x23]. Получение следующей ошибки.. Matrix dimensions must agree '=='Error occurred: single_load (line 49)idx = ceil (find (repmat (old_sig, nIdx, 1) == Idx ') / nIdx);

Htet 21.05.2019 10:36

@htetmyet Не видя код, который вы на самом деле используете, т.е. не тот, что в исходном вопросе, невозможно указать на возможную ошибку. Что такое R_i, какие у него размеры? Редактировать: Теперь вы отредактировали R_i на Idx. Прежде чем публиковать здесь, убедитесь, что вы не добавили никаких ошибок при «затенении» исходного кода.

HansHirse 21.05.2019 10:39
R_i — это Idx из моего вопроса, и это размер [1x23], а old_sig имеет размер [1x10000].
Htet 21.05.2019 10:45

@htetmyet Опять же, не видя остальной части вашего кода, невозможно вам помочь. repmat(old_sig, nIdx, 1) должен предоставлять массив [23x10000], а Idx' должен быть [23x1] вектором, так что == обычно должен работать, поскольку тогда он выполняет поэлементное сравнение для каждой строки. nIdx == 23?

HansHirse 21.05.2019 10:49
nIdx == 23, правильно, и Idx' тоже [23x1]. Все представленное здесь является исходным кодом, за исключением небольших изменений в именах переменных.
Htet 21.05.2019 11:12

@htetmyet Хорошо, последняя попытка: я отредактировал свой код, см. соответствующую строку. Правая часть сравнения теперь явно имеет те же размеры, что и левая сторона сравнения.

HansHirse 21.05.2019 11:58

Теперь это работает как шарм. Спасибо за быстрый ответ и решение. Ценится.

Htet 21.05.2019 13:48

@htetmyet Рад, что смог помочь. Могу я предположить, что вы используете более старую версию MATLAB, по крайней мере, что-то до R2016b? В моем первоначальном решении я использовал метод, называемый неявным расширением, который был представлен в R2016b. Это позволяет выполнять такие арифметические действия, как сложение матриц и векторов, что, по-видимому, не помогло вам. Мне потребовалось некоторое время, чтобы понять это. Итак, для будущих вопросов я бы посоветовал вам указать, какой MATLAB вы используете. :)

HansHirse 21.05.2019 13:54

Вы правы, работаю на R2015a. Спасибо за ваше предложение и отметил для моих дальнейших вопросов. :)

Htet 21.05.2019 13:59

Вы тестировали свой код с большими матрицами, потому что он возвращает Empty matrix: 0x1 вместо idx при применении к реальным данным.

Htet 22.05.2019 09:15

@htetmyet Ограниченная постановка проблемы (включая отсутствие предоставления «реальных» данных в первую очередь) приводит к ограниченному решению. Это довольно распространено здесь, на SO. Я сейчас прекращу дальнейшую "поддержку" этого вопроса. Задайте новый вопрос, предоставив весь ваш код (включая предполагаемую ошибочную часть моего решения) вместе с вашими «настоящими» данными.

HansHirse 22.05.2019 09:22

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