Переплетение векторов

Я хотел бы переплетать два вектора в 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, который хорошо определен между двумя матрицами.