2012-04-25 2 views
14

Я хотел бы переплетать два вектора в MATLAB. Фактически, я бы просто хотел добавить ноль между каждым элементом, но я решил, что задаю вопрос таким образом, чтобы узнать, как применить это к другим ситуациям.Переплетение векторов

Мое специфическое применение: Я хотел бы взять вектор (например, [1 2 3]) и вывести [0 1 0 2 0 3].

Более широкий вопрос: Как бы это сделать с двумя разными векторами, например. [1 2 3] и [9 8 7] переплетение для производства [9 1 8 2 7 3].

Любая помощь очень ценится по одному или обоим вышеперечисленным вопросам.

ответ

8

Вот код, который будет выполнять то, что вы хотите:

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 вы должны убедиться, что это вектор строки.

+1

Чтобы гарантировать, что это вектор строки, вы можете написать ' nums (:) '' – Jonas

+0

Решение' reshape' очень элегантно! – Anael

10

Попробуйте

reshape([[9 8 7];[1 2 3]],1,[]) 
+0

Мне очень нравится это решение, но, глядя на документацию, я не вижу никакой гарантии, что эта функция будет вести себя таким образом для всех входных данных или для будущих реализаций функции. В частности, кажется, что это только гарантирует, что: «reshape (X, SIZ) возвращает массив N-D с теми же элементами, что и X, но преобразуется в размер SIZ». –

+0

@JacobLee: Это использование 'reshape' безопасно для использования. Первый аргумент - это матрица, следующая за 1, а laceholder всегда преобразуется в 1xn. – Daniel

+0

Более общая версия, работающая для ввода строк и столбцов, будет 'reshape ([A (:). '; B (:).'], 1, [])' – Daniel

25

Я бы использовал внутреннюю компоновку векторов 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 
+0

Тривиально, но чтобы вернуть вектор строки, можно, конечно, изменить последнюю строку следующим образом: 'c = A (:) ';' –

+2

Использовать '.'' вместо' '', иначе это не сработает с комплексными числами. – Daniel

4

Я написал функцию MATLAB, что на бирже файлов сайта (Interleave Vectors or 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] 
4

Для самый простой случай - довольно «изящное» решение с одним слоем, как описано в this answer, к аналогичному вопросу.

a = [9 8 7]; 
b = [1 2 3]; 
output = kron(a, [1 0]) + kron(b, [0 1]); 

Как указано в ответе иметь в виду, что это менее эффективным однако может служить для более общего назначения, чем просто перемежения, как он использует Kronecker product, который хорошо образованный между двумя матрицами.

Смежные вопросы