سؤال

دعنا نقول أن لدي صفيف أحادي البعد:

a = [1, 2, 3];

هل هناك وظيفة MATLAB مدمجة تأخذ صفيفًا ومكتسبًا صحيحًا 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 مرات.

يمكن أن تكون الحجة الثانية أيضًا متجهًا بنفس طول V لتحديد عدد النسخ المتماثلة لكل عنصر. لتكرار 2D:

B = repelem(A,N1,N2)

لا حاجة الى kron أو حيل أخرى بعد الآن!

تحديث: لمقارنة الأداء مع الأساليب السريعة الأخرى ، يرجى الاطلاع على سؤال وجواب كرر نسخ من عناصر المصفوفة: فك تشفير الطول في ماتلاب.

نصائح أخرى

أنا من محبي كرون وظيفة:

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

b =

    1     1     1     2     2     2     3     3     3

يمكنك أيضا النظر إلى هذا السؤال ذي الصلة (التي تعاملت مع العناصر المتكررة من المصفوفات ثنائية الأبعاد) لرؤية بعض الحلول الأخرى التي تنطوي على فهرسة المصفوفة. إليك حل واحد من هذا القبيل (مستوحى من إجابة إدوريك):

>> 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