在octave / matlab中每隔n个位置插入一个数组中的项目

时间:2016-05-12 19:55:19

标签: arrays matlab octave

如何在(a1)

中的每个第n个位置的数组(a2)中插入元素

示例:逻辑

a1 = [1,10,2,20,3,30,4,40,5,50];
a2 = [100,200,300,400,500];
n=3 % n would be the position to place the elements found in (a2) every **nth** position in (a1).  
*n is the starting position at which the array a2 is inserted into a1*

a1 ,如果 n = 3 ,将 a2 插入其中后将显示为

a1 = [1,10,100,2,20,200,3,30,300,4,40,400,5,50,500];

a1 如果 n = 2 ,将 a2 插入其中后会显示为

a1 = [1,100,10,2,200,20,3,300,30,4,400,40,5,500,50];

a1 如果 n = 1 ,将 a2 插入其中后将会显示为

a1 = [100,1,10,200,2,20,300,3,30,400,4,40,500,5,50];

我试过

a1(1:3:end,:) = a2;

但我得到尺寸不匹配错误。

请注意,这只是一个示例,所以我不能只计算答案我需要将数据插入数组 n 是数组 a2 插入 a1

的起始位置

2 个答案:

答案 0 :(得分:1)

首先分配组合大小的数组,然后将两个原始数组插入到所需的索引中。使用a2很容易,您可以使用n:n:end。要获得a1的索引,您可以从所有索引集中减去a2索引集:

a1 = [1,10,2,20,3,30,4,40,5,50];
a2 = [100,200,300,400,500];
n = 3;

res = zeros(1,length(a1)+length(a2));
res(n:n:n*length(a2)) = a2;
a1Ind = setdiff(1:length(res), n:n:n*length(a2));
res(a1Ind) = a1;

>> res
res =
     1    10   100     2    20   200     3    30   300     4    40   400     5    50   500

答案 1 :(得分:0)

另一种选择是使用 circshift 来移动你想要的行

orig_array=[1:5;10:10:50;100:100:500;1000:1000:5000];
row_on_top=3 %row to be on top

[a1_rows a1_cols]=size(orig_array)
a1 = circshift(orig_array, [-mod(row_on_top,a1_rows)+1, 0])
Anew = zeros(1,a1_rows*a1_cols)
for n=1:1:a1_rows
  n
  insert_idx=[n:a1_rows:a1_cols*a1_rows]  %create insert idx
  Anew(insert_idx(1:a1_cols))=a1(n,:) %insert only 1:a1_cols values

end
Anew=Anew(:)