2

如何在数组中的每个第 n 个元素之后添加让我们说 [someVal,someVal]

所以例如假设我有

p = [0,1,2,3,4,5]

现在我想在每 2 个元素之后插入 [9,9] 一些东西,所以我的结果应该是

ans = [0 1 9 9 2 3 9 9 4 5 9 9]

如果你有

p = [1,2,3]

那么你应该最终得到

p = [1 2 9 9 3]

我想知道如何解决这个问题,如果你能告诉我我应该在哪里看,那就太好了,因为我是 MatLab 的新手。

谢谢你的时间。

4

2 回答 2

4

这是一个向量化的解决方案,用于在每个元素之后将向量q插入向量:pn

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
于 2013-01-31T18:47:32.773 回答
0

直到现在,我看到给出的解决方案尝试在正确的位置添加 [9 9]。

这是一个从不同角度看待事物的解决方案。它不是将填充向量放入原始向量中,而是创建一个填充为 9 的背景并将向量插入正确的位置。

我没有测试它,但它应该非常有效:

p = 0:5; %Suppose this is your vector
N = length(p);
v = zeros(N+2*floor(N/2),1)+9; %Start with the `background` of the right size
v(1:4:end) = p(1:2:end);
v(2:4:end) = p(2:2:end); 
v'

请注意,此解决方案很容易扩展到 P 是矩阵的情况,您可以在任何地方添加一个维度。

于 2013-02-01T10:03:16.807 回答