MATLAB вставляет значение между ними

в MATLAB я хочу вставить значение на полпути между каждым элементом в векторе

Например

  v=[1,3,5,7,9]

я хочу получить

  v=[1,2,3,4,5,6,7,8,9]

есть ли быстрый способ сделать это?


person Robert Dennis    schedule 19.03.2011    source источник


Ответы (3)


Очень простой общий способ сделать это — использовать интерполяцию, в частности функцию INTERP1:

>> v = [1 3 5 7 9]

v =

     1     3     5     7     9

>> v = interp1(v,1:0.5:numel(v))

v =

     1     2     3     4     5     6     7     8     9
person gnovice    schedule 20.03.2011

Поскольку вы просто хотите, чтобы было вставлено среднее значение каждых двух значений, вы можете сделать следующее:

v = [1 3 5 7 9];
W = zeros(1,2*numel(v)-1);
W(1:2:end) = v;
W(2:2:end-1) = (W(1:2:end-2) + W(3:2:end))/2

Если вам нужно что-то еще, взгляните на interp1, который позволит для более продвинутой интерполяции.

person Egon    schedule 19.03.2011
comment
это был просто пример. вы не знаете какие у него два вектора. - person ; 20.03.2011
comment
@ d'o-o'b: из вопроса это было неясно, второй вектор не упоминается или какими должны быть его значения. На полпути между каждым элементом я подумал, что он хотел, чтобы значение было вставлено между обоими элементами, чтобы значение было на полпути между значениями. - person Egon; 20.03.2011

если diff(v) является константой, как в вашем примере [1 3 5 7 9], вы можете сделать это так:

>> v=[1 3 5 7 9]  
v =
     1     3     5     7     9
>> w=linspace(v(1),v(length(v)),2*length(v)-1)
w =
     1     2     3     4     5     6     7     8     9

как говорится в официальном справочном документе:

y = linspace(x1,x2,n) generates n points. The spacing between the points is (x2-x1)/(n-1).

Если diff(v) не является константой, например v=[1 3 6 8 10], вы можете сначала вычислить разницу, используя

dv=diff(v)

тогда вы можете иметь w

w=ones(1,2*length(v)-1) %initialize
w(1:2:length(w))=v; % odd element
w(2:2:length(w)-1)=v(1:length(v)-1)+diff(v)*0.5  %even element
person Statham    schedule 24.10.2016