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

以下は、すべての要素の後に vectorqを vectorに挿入するためのベクトル化されたソリューションです。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

説明

これを例で説明するのが最も簡単です。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
于 2013-01-31T18:47:32.773 に答える
0

今まで私は与えられた解決策が正しい場所に[99]を追加しようとしているのを見ます。

これは、物事を別の視点から見るソリューションです。パディングベクトルを元のベクトルに配置するのではなく、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が行列の場合に簡単に拡張できることに注意してください。どこにでも、1つの次元を追加するだけです。

于 2013-02-01T10:03:16.807 に答える