这是一个向量化的解决方案,用于在每个元素之后将向量q
插入向量:p
n
N = numel(p);
M = mod(N, n);
p_pad = [p(:); zeros((n - M) * (M > 0), 1)];
res = [reshape(p_pad, n, []); repmat(q(:), 1, numel(p_pad) / n)];
res = res(1:N + numel(q) * fix(N / n));
您可以通过添加以下内容来保留输出的输入向量行/列属性:
if isrow(p)
res = res';
end
解释
用一个例子来解释这一点是最容易的。我们从向量开始p
,我们想把它重塑成一个矩阵,每列都有n
元素。如果元素的数量p
不是 的倍数n
,我们需要“填充”它(例如,用零)。例如,对于p = [1 2 3 4 5 6 7], n = 3
,我们将重塑p
为以下矩阵:
1 4 7
2 5 0
3 6 0
现在我们使用repmat
复制向量q
并生成另一个具有相同列数的矩阵,其中每列是q
:
9 9 9
9 9 9
然后我们垂直连接这两个矩阵(在我的代码中,新矩阵被称为res
):
1 4 7
2 5 0
3 6 0
9 9 9
9 9 9
在我们再次把这个矩阵变成一个向量,将列连接在一起之后,我们应该得到想要的结果。请注意,我们还想丢弃尾随0 0 9 9
(由于填充而形成),因此让我们计算L
结果中的预期元素数量:
L = N + length(q) * fix(N / n)
然后提取我们将只L
从我们的res
.
对列进行操作通常最容易,因为MATLAB 的线性索引是列主要的。
例子
让我们把它放到一个函数中:
function y = insertn(p, q, n)
N = numel(p);
p_pad = [p(:); zeros((n - mod(N, n)) * (mod(N, n) > 0), 1)];
y = [reshape(p_pad, n, []); repmat(q(:), 1, numel(p_pad) / n)];
y = y(1:N + numel(q) * fix(N / n));
if isrow(p)
y = y';
end
现在让我们针对不同的输入对其进行测试:
>> insertn(0:5, [9 9], 2)
ans =
0 1 9 9 2 3 9 9 4 5 9 9
>> insertn(1:3, [9 9], 2)
ans =
1 2 9 9 3
>> insertn(1:7, [9 9], 3)
ans =
1 2 3 9 9 4 5 6 9 9 7