以下は、すべての要素の後に vectorq
を vectorに挿入するためのベクトル化されたソリューションです。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
説明
これを例で説明するのが最も簡単です。vector から始めて、各列に要素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
次に、これら 2 つの行列を垂直に連結します (私のコードでは、新しい行列は と呼ばれ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)
次に、extractL
から最初の要素を抽出します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