如何在数组中的每个第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的新手。
感谢您的时间。
答案 0 :(得分:4)
这是一个向量化解决方案,用于在每个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's linear indexing是列专业。
让我们把它放到一个函数中:
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
答案 1 :(得分: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是矩阵的情况,您可以在任何地方添加一个维度。