2013-10-23 15 views
5

Về cơ bản, nếu tôi có ma trận sau:Làm cách nào để tăng gấp đôi kích thước của vectơ trong MATLAB với nội suy?

[1, 2, 3 ,4, 10] 

tôi cần phải nổ nó trong khi nội suy, như sau:

[1, 1.5, 2, 2.5, 3, 3.5, 4, 7, 10].

Về cơ bản, hãy buff nó bằng cách điền vào giá trị trung bình của hai giá trị xung quanh.

Giả sử tôi cần làm điều này cho n thay vì chỉ thêm 1 giá trị như chúng tôi có ở đây.

Trả lời

16

Bạn cần phải sử dụng interp1 với phương pháp nội suy 'linear':

>> v = [1 2 3 4 10]; 
>> newNum = 13; % new number of elements in the "buffed" vector 
>> iv = interp1(linspace(0,1,numel(v)), v, linspace(0,1,newNum)) 
iv = 
1.0000 1.3333 1.6667 2.0000 2.3333 2.6667 3.0000 3.3333 3.6667 4.0000 6.0000 8.0000 10.0000 
7

Các đầu vào cho interp1 không phải lúc nào cũng như tầm thường như họ có vẻ - nếu bạn đang cố gắng để tăng tỷ lệ mẫu của bạn đến một số tiền nhất định mà không một ca lệch, không chỉ tăng số lượng các phần tử trong khi ghim các điểm kết thúc. Bạn đang yêu cầu điều kiện thứ hai, để giải pháp đó đã được đăng, nhưng tôi nghĩ rằng nó cũng đáng để thể hiện cách kiểm soát tốc độ lấy mẫu.

Đi câu trả lời hoàn toàn hợp lệ Shai cho tăng số lượng các yếu tố mà không quan tâm đến sự thay đổi trong tỷ lệ mẫu, đối với trường hợp này:

v = [1 2 3 4 10]; % 1x5 
newNum = 10; % double the number 
X = linspace(0,1,numel(v)); 
Xi = linspace(0,1,newNum); 
iv = interp1(X, v, Xi, 'linear') 

này nói rằng chúng ta muốn tăng số lượng các yếu tố 5-10 - - nhân đôi số phần tử - trong khi ghim các điểm kết thúc. Xác định tỷ lệ mẫu ban đầu cho v thành 1, sau đó tỷ lệ mẫu là iv là bao nhiêu?

>> iv = interp1(linspace(0,1,numel(v)), v, linspace(0,1,newNum)) 
iv = 
    Columns 1 through 8 
    1.0000 1.4444 1.8889 2.3333 2.7778 3.2222 3.6667 4.6667 
    Columns 9 through 10 
    7.3333 10.0000 
>> fs_v = X(2) - X(1) % even spacing 
fs_v = 
    0.2500 
>> fs_vi = Xi(2) - Xi(1) 
fs_vi = 
    0.1111 
>> fs_v/fs_vi 
ans = 
    2.2500 

Nhiều hơn gấp đôi. Vâng, rõ ràng khi bạn nghĩ về nó, nhưng hãy xem xét nếu đây là những gì bạn muốn. Bạn nhận được kết thúc được ghim tại iv(1)=1iv(end)=10, nhưng bạn không chỉ định thay đổi về tỷ lệ mẫu.

Bây giờ, giả sử bạn muốn tăng tỷ lệ mẫu chính xác gấp đôi. Bạn không thể nhận được rằng có hai đầu gắn ở 1 và 10. Để xác định một Xi đem đến cho bạn sự thay đổi tỷ lệ mẫu phải:

scale = numel(v)/newNum; % i.e. 0.5 
X = 1:numel(v); 
Xi = (1:newNum)*scale + 0.5 * (1 - scale); % centered 

Kết thúc sẽ không được ghim, nhưng tỷ lệ mẫu sẽ đã tăng gấp đôi:

>> iv = interp1(X, v, Xi, 'linear', 'extrap') 
iv = 
    Columns 1 through 8 
    0.7500 1.2500 1.7500 2.2500 2.7500 3.2500 3.7500 5.5000 
    Columns 9 through 10 
    8.5000 11.5000 
>> (X(2) - X(1))/(Xi(2) - Xi(1)) 
ans = 
    2 

Ít nhất trong xử lý tín hiệu, bạn thường sau khi thay đổi tỷ lệ mẫu không được tính.

Các vấn đề liên quan