Имеется матрица 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]
.....





Вот мое предложение по решению этой проблемы:
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);
@htetmyet Не видя код, который вы на самом деле используете, т.е. не тот, что в исходном вопросе, невозможно указать на возможную ошибку. Что такое R_i, какие у него размеры? Редактировать: Теперь вы отредактировали R_i на Idx. Прежде чем публиковать здесь, убедитесь, что вы не добавили никаких ошибок при «затенении» исходного кода.
R_i — это Idx из моего вопроса, и это размер [1x23], а old_sig имеет размер [1x10000].
@htetmyet Опять же, не видя остальной части вашего кода, невозможно вам помочь. repmat(old_sig, nIdx, 1) должен предоставлять массив [23x10000], а Idx' должен быть [23x1] вектором, так что == обычно должен работать, поскольку тогда он выполняет поэлементное сравнение для каждой строки. nIdx == 23?
nIdx == 23, правильно, и Idx' тоже [23x1]. Все представленное здесь является исходным кодом, за исключением небольших изменений в именах переменных.
@htetmyet Хорошо, последняя попытка: я отредактировал свой код, см. соответствующую строку. Правая часть сравнения теперь явно имеет те же размеры, что и левая сторона сравнения.
Теперь это работает как шарм. Спасибо за быстрый ответ и решение. Ценится.
@htetmyet Рад, что смог помочь. Могу я предположить, что вы используете более старую версию MATLAB, по крайней мере, что-то до R2016b? В моем первоначальном решении я использовал метод, называемый неявным расширением, который был представлен в R2016b. Это позволяет выполнять такие арифметические действия, как сложение матриц и векторов, что, по-видимому, не помогло вам. Мне потребовалось некоторое время, чтобы понять это. Итак, для будущих вопросов я бы посоветовал вам указать, какой MATLAB вы используете. :)
Вы правы, работаю на R2015a. Спасибо за ваше предложение и отметил для моих дальнейших вопросов. :)
Вы тестировали свой код с большими матрицами, потому что он возвращает Empty matrix: 0x1 вместо idx при применении к реальным данным.
@htetmyet Ограниченная постановка проблемы (включая отсутствие предоставления «реальных» данных в первую очередь) приводит к ограниченному решению. Это довольно распространено здесь, на SO. Я сейчас прекращу дальнейшую "поддержку" этого вопроса. Задайте новый вопрос, предоставив весь ваш код (включая предполагаемую ошибочную часть моего решения) вместе с вашими «настоящими» данными.
Я вижу, вы привыкли писать посты, а не вопросы. Вопросы в английском языке — это предложения, на которые можно получить ответ и которые заканчиваются знаком вопроса, ?. Поскольку Stack Overflow является сайтом вопрос и ответов, размещение вопроса является обязательным. Причина этого в том, что иначе сложно понять, в чем именно вы хотите, чтобы мы вам помогли. Пожалуйста, возьмите тур и прочитайте Как спросить, затем редактировать свои сообщения, чтобы они содержали конкретный вопрос.