如何在Matlab中以规则的间隔在向量中插入元素

时间:2016-08-09 08:31:30

标签: matlab append

我在Matlab中有13个实体的向量。

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

我想在1 5 9 13&位置定期追加价值[1 2 3 4 5]。 17。 a的最终值看起来像这样。

a = [ 1 3 4 6 2 8 1 5 3 8 9 3 4 7 3 6 5 2]。

带斜体的值显示附加值。 我该怎么办?

4 个答案:

答案 0 :(得分:7)

由于您需要定期检查,因此可以使用reshapecat功能:

a = [3 4 6 8 1 5 8 9 3 7 3 6 2];
v = [1 2 3 4 5];
l = [1 5 9 13 17];

interval = l(2)-l(1)-1; %computes the interval between inserts
amax = ceil(size(a,2)/interval) * interval; %calculating maximum size for zero padding
a(amax) = 0; %zero padding to allow `reshape`
b = reshape (a,[interval,size(v,2)]); %reshape into matrix
result = reshape(vertcat (v,b), [1,(size(b,1)+1)*size(b,2)]); %insert the values into the right position and convert back into vector

%remove padded zeros
final = result(result ~= 0) %remove the zero padding.

>>final =

第1至16栏

 1     3     4     6     2     8     1     5     3     8     9     3     4     7     3     6

第17至18栏

 5     2

答案 1 :(得分:1)

以下是使用boolean-indexing -

的方法
% Inputs
a = [3 4 6 8 1 5 8 9 3 7 3 6 2]
append_vals = [1 2 3 4 5]
append_interval = 4 % Starting at 1st index

% Find out indices of regular intervals where new elements are to be inserted.
% This should create that array [1,5,9,13,17]
N_total = numel(a) + numel(append_vals)
append_idx = find(rem(0:N_total-1,append_interval)==0)

% Get boolean array with 1s at inserting indices, 0s elsewhere
append_mask = ismember(1:N_total,append_idx)

% Setup output array and insert new and old elements
out = zeros(1,N_total)
out(~append_mask) = a
out(append_mask) = append_vals

或者,我们也可以使用linear-indexing并避免创建append_mask,就像这样 -

% Setup output array and insert new and old elements
out = zeros(1,N_total)
out(append_idx) = append_vals
out(setdiff(1:numel(out),append_idx)) = a

答案 2 :(得分:0)

a=[3 4 6 8 1 5 8 9 3 7 3 6 2]; % // Your original values
pos = [1 5 9 13 17]; % // The position of the values you want to insert
b=[1 2 3 4 5]; % // The values you want to insert

% // Pre-allocate a vector with the total size to hold the resulting values
r = zeros(size(a,2)+size(pos,2),1);

r(pos) = b % // Insert the appended values into the resulting vector first
r3 = r.' <1 % // Find the indices of the original values. These will be zero in the variable r but 1 in r3   
ans =

   0   1   1   1   0   1   1   1   0   1   1   1   0   1   1   1   0   1

ind= find(r3==1) % // Find the indices of the original values

ind =

    2    3    4    6    7    8   10   11   12   14   15   16   18

r(ind) = a; % // Insert those into the resulting vector.

r.'
ans =

   1   3   4   6   2   8   1   5   3   8   9   3   4   7   3   6   5   2

答案 3 :(得分:0)

您可以使用此函数将一堆值附加到现有向量,给定它们在新向量中的位置:

function r=append_interval(a,v,p)

% a - vector with initial values
% v - vector containing values to be inserted 
% p - positions for values in v

lv=numel(v); % number of elements in v vector
la=numel(a); % number of elements in a vector

column_a=iscolumn(a); % check if a is a column- or row- wise vector

tot_elements=la+lv;

% size of r is tha max between the total number of elements in the two vectors and the higher positin in vector p (in this case missing positions in a are filled with zeros)
lr=max([max(p) tot_elements]);

% initialize r as nan vector
r=zeros(column_a*(lr-1)+1,~column_a*(lr-1)+1)/0;

% set elements in p position to the corresponding values in v
r(p)=v;

% copy values in a in the remaining positions and fill with zeros missing entries (if any)
tot_missing_values=lr-tot_elements;
if(tot_missing_values)
    remaining_values=cat(2-iscolumn(a),a,zeros(column_a*(tot_missing_values-1)+1,~column_a*(tot_missing_values-1)+1));
else
    remaining_values=a;
end

% insert values
r(isnan(r))=remaining_values;

您可以使用行方向或列方向向量; r的方向与a的方向相同。

输入:

a =

     3     4     6     8     1     5     8     9     3     7     3     6     2

v =

     1     2     3     4     5


p =

     1     5     9    13    17

输出:

>> append_interval(a,v,p)

ans =

     1     3     4     6     2     8     1     5     3     8     9     3     4     7     3     6     5     2

允许每个正位置序列,并且函数将使用零填充最终向量,以防您指示除原始向量和添加项之和之外的位置。

例如,如果:

v3 =

     1     2     3     4     5     6    90

p3 =

     1     5     9    13    17    30    33

你得到:

append_interval(a,v3,p3)

ans =

  Columns 1 through 19

     1     3     4     6     2     8     1     5     3     8     9     3     4     7     3     6     5     2     0

  Columns 20 through 33

     0     0     0     0     0     0     0     0     0     0     6     0     0    90

希望这会有所帮助。