Переплетение векторов
Я хотел бы переплетать два вектора в MATLAB. Фактически, я бы просто хотел добавить ноль между каждым элементом, но я решил, что задаю вопрос таким образом, чтобы узнать, как применить это к другим ситуациям.
Мое конкретное приложение:
Я хотел бы взять вектор (например, [1 2 3]
) и вывести [0 1 0 2 0 3]
.
Более широкий вопрос:
Как бы это сделать с двумя разными векторами, например. [1 2 3]
и [9 8 7]
переплетение для создания [9 1 8 2 7 3]
.
Любая помощь была высоко оценена по одному или обоим вышеперечисленным вопросам.
Ответы
Ответ 1
Вот какой код, который выполнит то, что вы хотите:
nums = rand(1,3)
output = zeros(1,2*numel(nums));
output(2:2:end) = nums
Вывод следующий:
nums =
0.9134 0.6324 0.0975
output =
0 0.9134 0 0.6324 0 0.0975
Следуя стилю двух других ответов, вы можете получить нужный нулевой результат следующим образом:
nums = rand(1,3);
reshape([zeros(size(nums));nums],1,[])
Очевидно, что nums
следует заменить на вектор, который вы хотите использовать. Как уже упоминалось, перед вызовом reshape
вы должны убедиться, что это вектор строки.
Ответ 2
Я бы использовал внутреннюю компоновку векторов MATLAB: они хранятся в столбце-столбце, то есть значения в столбце меняются быстрее. Чтобы чередовать два вектора a
и b
, просто выполните:
ar = a(:)'; % make sure ar is a row vector
br = b(:)'; % make sure br is a row vector
A = [ar;br]; % concatenate them vertically
c = A(:); % flatten the result
Ответ 3
Try
reshape([[9 8 7];[1 2 3]],1,[])
Ответ 4
Я написал функцию MATLAB, которая на сайте File Exchange (Interleave Vectors или Matrices) делает именно то, что вы хотите и многое другое. Просто загрузите файл .m и поместите файл в тот же каталог, что и другие .m файлы, или скопируйте и вставьте эту функцию в свою программу.
Эта функция перемежает любое число векторов или матриц по строке или столбцу. Если входные данные являются только векторами, нет необходимости указывать ориентацию. Дополнительные элементы/строки/столбцы добавляются в конец выходной матрицы. Другие предоставленные ответы очень специфичны для векторов равной длины или требуют правильной ориентации векторов.
Примеры использования функции:
1) Перемещая строки матриц
A = [1 2; 3 4] B = [5 6;7 8]
C = interleave2(A, B, 'row')
C = [1 2
5 6
3 4
7 8]
2) Перемещающие столбцы матриц
C = interleave2(A, B, 'col')
C = [1 5 2 6
3 7 4 8]
3) Перенесение векторов (Примечание: входные векторы не должны быть одинаковой ориентации)
A = [1 2 3 4] B = [5 6 7 8 9]'
C = interleave2(A, B)
C = [1 5 2 6 3 7 4 8 9]'
4) Перемещение > 2 матрицы
A = [1 2;3 4] B = [5 6;7 8]
C = [9 10;11 12] D = [13 14;15 16]
E = interleave2(A, B, C, D, 'col')
E = [1 5 9 13 2 6 10 14
3 7 11 15 4 8 12 16]
5) Интерферирующие столбцы из 2-х матриц с неравными столбцами
A = [1 2;3 4]
B = [5 6 7 8;9 10 11 12]
C = interleave2(A, B, 'col')
C = [1 5 2 6 7 8
3 9 4 10 11 12]
6) Перемещение > 2 вектора неравных длин
A = [1 2 3 4] B = [5 6 7]
C = [8 9 10 11 12 13]
D = interleave2(A, B, C)
D = [1 5 8 2 6 9 3 7 10 4 11 12 13]
Ответ 5
В самом простом случае есть довольно "элегантное" решение с однострочным слоем, как описано в этот ответ для аналогичного вопрос.
a = [9 8 7];
b = [1 2 3];
output = kron(a, [1 0]) + kron(b, [0 1]);
Как указано в ответе, имейте в виду, что это менее эффективный, но может служить для более общего назначения, чем просто чередование, поскольку оно использует продукт Kronecker, который хорошо определен между двумя матрицами.