質問

1 次元配列があるとします。

a = [1, 2, 3];

配列と整数を受け取る組み込みの Matlab 関数はありますか n アレイの各要素をn回複製しますか?

たとえば電話をかけると replicate(a, 3) 返すべきです [1,1,1,2,2,2,3,3,3].

これは全く同じではないことに注意してください repmat. 。確実に実装できるよ replicate することによって repmat 各要素を実行して結果を連結しますが、より効率的な組み込み関数があるかどうか疑問に思っています。

役に立ちましたか?

解決

R2015a 以降, 、があります。 これを行うための組み込みおよび文書化された関数、 repelem:

repelem 配列の要素を複製します。
    W = repelem(V,N), 、ベクトル付き V とスカラー N, 、ベクトルを作成します W ここで、の各要素は V 繰り返される N 回。

2 番目の引数は、次と同じ長さのベクトルにすることもできます。 V 各要素の複製の数を指定します。2D レプリケーションの場合:

B = repelem(A,N1,N2)

必要ありません kron または他のトリックはもうありません!

アップデート: 他の高速な方法とのパフォーマンスの比較については、Q&A を参照してください。 配列要素のコピーを繰り返します。MATLAB でのランレングス デコード.

他のヒント

私はのファンです クロン 関数:

>> a = 1:3;
>> N = 3;
>> b = kron(a,ones(1,N))

b =

    1     1     1     2     2     2     3     3     3

も見ることができます この関連する質問 (2 次元行列の要素の複製を扱ったもの) を参照して、行列のインデックス付けに関連する他のソリューションをいくつか確認してください。ここにそのような解決策の 1 つを示します (以下からインスピレーションを受けました) エドリックの答え):

>> b = a(ceil((1:N*numel(a))/N))

b =

    1     1     1     2     2     2     3     3     3
a = [1 2 3];
N = 3;

b = reshape(repmat(a,N,1), 1, [])
>> n=3;
>> a(floor((0:size(a,2)*n-1)/n)+1)

ans =

     1     1     1     2     2     2     3     3     3

いくつかのエキゾチックな代替品。確かに役に立つというより面白いです:

  1. 次の (最初の) 結果を代入します。 meshgrid ベクトルに:

    b = NaN(1,numel(a)*n); %// pre-shape result
    b(:) = meshgrid(a,1:n);
    
  2. を乗じた行列を構築します。 a 結果が得られます:

    b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
    
  3. 使用 ind2sub インデックスを生成するには:

    [~, ind] = ind2sub([n 1],1:numel(a)*n);
    b = a(ind);
    

あなたは、画像処理ツールボックスを持っている場合は、別の選択肢があります:

N = 3;
imresize(a, [1 N*numel(a)],'nearest')
% To get b = [1 1 1 2 2 2 3 3 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a,1,numel(temp_a));

% To get b = [1 2 3 1 2 3 1 2 3]
N = 3;
a = [1 2 3];
temp_a = a(ones(N,1),:);
b = reshape(temp_a',1,numel(temp_a));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top