تكرار صفيف العنصر في Matlab
-
21-09-2019 - |
سؤال
دعنا نقول أن لدي صفيف أحادي البعد:
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
بعض البدائل الغريبة. من المسلم به أن أكثر مضحكة من المفيد:
تعيين النتيجة (الأولى)
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));