2012-04-25 35 views
14

Tôi muốn xen kẽ hai vectơ trong MATLAB. Trong thực tế, tôi thực sự chỉ muốn thêm một số không giữa mỗi phần tử, nhưng tôi đã tìm ra câu hỏi theo cách mà tôi sẽ học cách áp dụng điều này cho các tình huống khác.Vectơ đan xen

Ứng dụng cụ thể của tôi: Tôi muốn lấy một véc-tơ (ví dụ: [1 2 3]) và đầu ra [0 1 0 2 0 3].

Câu hỏi rộng hơn: Làm cách nào để thực hiện điều này với hai vectơ khác nhau, ví dụ: [1 2 3][9 8 7] đan xen để sản xuất [9 1 8 2 7 3].

Bất kỳ trợ giúp nào được đánh giá cao, trong một hoặc cả hai câu hỏi trên.

Trả lời

8

Dưới đây là một số mã mà sẽ thực hiện những gì bạn muốn:

nums = rand(1,3) 
output = zeros(1,2*numel(nums)); 
output(2:2:end) = nums 

Kết quả như sau:

nums = 

    0.9134 0.6324 0.0975 


output = 

     0 0.9134   0 0.6324   0 0.0975 

Tiếp nối phong cách của hai câu trả lời khác , bạn có thể nhận được kết quả đầu ra số 0 mong muốn của mình với các mục sau:

nums = rand(1,3); 
reshape([zeros(size(nums));nums],1,[]) 

Rõ ràng, nums nên được thay thế bằng véc tơ bạn muốn sử dụng. Như đã đề cập, bạn nên đảm bảo đó là một vectơ hàng trước khi gọi reshape.

+1

Để đảm bảo nó là một vectơ hàng, bạn có thể viết ' nums (:) '' – Jonas

+0

Giải pháp' reshape' rất thanh lịch! – Anael

10

Hãy thử

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

Tôi thực sự thích giải pháp này, nhưng nhìn vào tài liệu, tôi thấy không đảm bảo rằng chức năng này sẽ hoạt động theo cách này cho tất cả các đầu vào, hoặc để triển khai thực hiện trong tương lai. Đặc biệt, dường như chỉ đảm bảo rằng: "định hình lại (X, SIZ) trả về một mảng N-D với các phần tử giống như X nhưng được định hình lại thành kích thước SIZ". –

+0

@JacobLee: Việc sử dụng 'định hình lại' đó là an toàn để sử dụng. Đối số đầu tiên là một ma trận, sau 1 và một renholder luôn định dạng lại thành 1xn. – Daniel

+0

Một phiên bản tổng quát hơn làm việc cho các đầu vào hàng và cột sẽ là 'thay đổi hình dạng ([A (:). '; B (:).'], 1, [])' – Daniel

25

Tôi muốn sử dụng bố cục bên trong của vectơ MATLAB: Chúng được lưu trữ cột lớn, tức là, giá trị trong cột thay đổi nhanh nhất. Để đan xen hai vectơ ab, chỉ cần làm:

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

Không đáng kể, nhưng để làm cho nó trở lại một vectơ hàng, tất nhiên có thể thay đổi dòng cuối cùng như sau: 'c = A (:) ';' –

+2

Sử dụng '.'' thay vì'' ', nếu không nó sẽ không hoạt động với số phức. – Daniel

4

tôi đã viết một hàm MATLAB đó là trên trang web Trao đổi File (Interleave Vectors or Matrices) thực hiện chính xác những gì bạn muốn và nhiều hơn nữa. Chỉ cần tải xuống tệp .m và đặt tệp trong cùng thư mục với các tệp .m khác của bạn hoặc sao chép và dán hàm vào chương trình của bạn.

Hàm này xen kẽ bất kỳ số lượng vectơ hoặc ma trận nào theo hàng hoặc cột. Nếu đầu vào chỉ là vectơ, không cần chỉ định hướng. Các phần tử/hàng/cột bổ sung được thêm vào cuối ma trận đầu ra. Các câu trả lời khác được cung cấp là rất cụ thể cho các vectơ có chiều dài bằng nhau hoặc yêu cầu đảm bảo định hướng của vectơ là chính xác.

Ví dụ về cách sử dụng các chức năng:

1) hàng Interleaving của ma trận

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) Interleaving cột của ma trận

C = interleave2(A, B, 'col') 
C = [1 5 2 6 
    3 7 4 8] 

3) Interleaving vectơ (Lưu ý: đầu vào vectơ không cần phải định hướng giống nhau)

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) Interleaving> 2 ma trận

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) Interleaving cột của 2 ma trận với các cột bất bình đẳng

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) Interleaving> 2 vectơ có độ dài bất bình đẳng

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

Đối trường hợp đơn giản nhất có một giải pháp khá "thanh lịch" với một lớp lót như được mô tả trong this answer cho một câu hỏi tương tự.

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

Như đã nêu trong câu trả lời phải nhận thức được rằng đây là kém hiệu quả tuy nhiên có thể phục vụ cho một mục đích tổng quát hơn hơn là chỉ đan xen như nó sử dụng Kronecker product được rõ ràng giữa hai ma trận.