matlab - على - دوال الماتلاب pdf



كيفية طرح متجه من كل صف من مصفوفة؟ (2)

ممكن تكرار:
كيف يمكنني تقسيم كل صف من مصفوفة بواسطة صف ثابت؟

أنا أبحث عن طريقة أنيقة لطرح نفس الناقل من كل صف من مصفوفة. هنا طريقة غير أنيقة للقيام بذلك.

a = [1 2 3];
b = rand(7,3);
c(:,1) = b(:,1) - a(1);
c(:,2) = b(:,2) - a(2);
c(:,3) = b(:,3) - a(3);

أيضا ، لا يمكن أن تكون الطريقة الأنيقة أبطأ من هذه الطريقة.

لقد حاولت

c = b-repmat(a,size(b,1),1); 

ويبدو أبطأ.

تعديل: الفائز هو هذه الطريقة.

c(:,1) = b(:,1) - a(1);
c(:,2) = b(:,2) - a(2);
c(:,3) = b(:,3) - a(3);

EDIT: المزيد من الطرق ، ونتائج tic toc:

n = 1e6;
m = 3;
iter = 100;
a = rand(1,m);
b = rand(n,m);

tic
c = zeros(size(b));
for i = 1:iter
    c(:,1) = b(:,1) - a(1);
    c(:,2) = b(:,2) - a(2);
    c(:,3) = b(:,3) - a(3);
end
toc

tic
c = zeros(size(b));
for i = 1:iter
    c(:,1) = b(:,1) - a(1);
    c(:,2) = b(:,2) - a(2);
    c(:,3) = b(:,3) - a(3);
end
toc

tic
c = zeros(size(b));
for i = 1:iter
    for j = 1:3
        c(:,j) = b(:,j) - a(j);
    end
end
toc

tic
for i = 1:iter
    c = b-repmat(a,size(b,1),1);
end
toc

tic
for i = 1:iter
    c = bsxfun(@minus,b,a);
end
toc

tic
c = zeros(size(b));
for i = 1:iter
    for j = 1:size(b,1)
        c(j,:) = b(j,:) - a;
    end
end
toc

النتائج

Elapsed time is 0.622730 seconds.
Elapsed time is 0.627321 seconds.
Elapsed time is 0.713384 seconds.
Elapsed time is 2.621642 seconds.
Elapsed time is 1.323490 seconds.
Elapsed time is 17.269901 seconds.

https://src-bin.com


Answer #1

هنا مساهمتي:

c = b - ones(size(b))*diag(a)

الآن سرعة اختباره:

tic
for i = 1:10000
    c = zeros(size(b));
    b = rand(7,3);
    c = b - ones(size(b))*diag(a);
end
toc

النتائج:

Elapsed time is 0.099979 seconds.

ليس تماما بالسرعة ، لكنها نظيفة.


Answer #2

هناك ثلاثة إجابات واضحة فقط ، وأعطيت اثنين منهم في سؤالك.

والثالث على التوالي ،

c(1,:) = b(1,:) - a; %...

لكنني أتوقع أن تكون أبطأ من معالجة العمود الخاص بك للمصفوفات الكبيرة لأنه يصل إلى عناصر خارج ترتيب الذاكرة.

إذا قمت بتشغيل معالجة العمود الخاص بك في حلقة for في ملف * .m أو وظيفة فرعية ، فهل لا يزال أسرع من إصدار repmat ؟

شيء آخر يمكنك اختباره للسرعة: حاول preallocating c .

c = zeros(size(b));
c(:,1) = b(:,1) - a(1); %...




subtract