Matlab での要素ごとの配列のレプリケーション
-
21-09-2019 - |
質問
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 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
いくつかのエキゾチックな代替品。確かに役に立つというより面白いです:
次の (最初の) 結果を代入します。
meshgrid
ベクトルに:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);
を乗じた行列を構築します。
a
結果が得られます:b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
使用
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));