سؤال

هل هناك طريقة للجمع بين ناقلين في MATLAB مثل:

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

استخدام بناء جملة MATLAB العادي مشابهًا لـ:

mat = C * S(1:length(S))

وهذا يعطي "أبعاد المصفوفة الداخلية يجب أن توافق على خطأ" لأنها تحاول إجراء عمليات مصفوفة عادية.هذه ليست عملية جبر خطي قياسية، لذا لست متأكدًا من كيفية التعبير عنها بشكل صحيح في MATLAB، ولكن يبدو أنها يجب أن تكون ممكنة دون الحاجة إلى حلقة، وهي بطيئة للغاية في MATLAB.

هل كانت مفيدة؟

المحلول

من وصفك، يبدو الأمر وكأنه عملية مصفوفة بسيطة.عليك فقط التأكد من أن لديك الأبعاد الصحيحة ج و س. ج يجب أن يكون متجه عمود (الطول (ج)-بواسطة-1) ​​و س يجب أن يكون متجه صف (1-بواسطة-الطول (ق)).على افتراض أنها الأبعاد الصحيحة، فقط قم بما يلي:

mat = C*S;

إذا لم تكن متأكدًا من أبعادها، فمن المفترض أن ينجح هذا:

mat = (C(:))*(S(:)');

يحرر: في الواقع، لقد كنت مجنونًا بعض الشيء فيما يتعلق بالأقواس.بعضها غير ضروري، حيث لا توجد مخاوف تتعلق بأمر التشغيل.إليك نسخة أنظف:

mat = C(:)*S(:)';

توضيح:

ال عامل ضرب المصفوفة في MATLAB سوف ينتج إما ملف منتج داخلي (مما يؤدي إلى قيمة عددية) أو المنتج الخارجي (ينتج عنه مصفوفة) اعتمادًا على أبعاد المتجهات المطبقة عليها.

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

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

نصائح أخرى

وحاول تنفيذ هذا في MATLAB:

mat = C*S'

وكما في:

C = [1; 2; 3];
S = [2; 2; 9; 1];

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

% Equivalent code:
mat2 = C*S';

myDiff = mat - mat2

هل تعني ما يلي:؟

mat = zeros(length(C),length(S));
for j=1:length(C)
    mat(j,:)=C(j)*S;
end

وإذا كان الأمر كذلك، انها ببساطة ضرب المصفوفات:

C' * S    % if C and S are row vectors
C * S'    % if C and S are column vectors

إذا كنت لا تعرف ما إذا كانت C وS هي ناقلات صف أو عمود ناقلات، يمكنك استخدام خدعة لتحويلها إلى ناقلات العمود، ثم تبديل S قبل ضرب بعضهم:

C(:) * S(:)'

وأنا لست واضحة تماما على ما تفعلونه - يبدو أن المصفوفة الناتجة الخاص بك وسوف تتكون من صفوف length(C)، حيث الصف ith هو S ناقلات تحجيم قبل دخول ith من C (منذ subscripting متجه يعطي العددية). في هذه الحالة، يمكنك أن تفعل شيئا مثل

mat = repmat(C,[1 length(S)]) .* repmat(S, [length(C) 1])

وأين أنت البلاط C عبر الأعمدة، وS أسفل الصفوف.

وجرب هذا:

C = 1: 3 S = 1: 5 mat1 = C '* S

وmat2 = bsxfun (times، C، S)

و(خاصة جيدة عندما وظيفة تحتاج ليست أكثر بساطة تدوين MATLAB)

و- لورين

وحاول استخدام meshgrid:

[Cm, Sm] = meshgrid(C, S);
mat = Cm .* Sm;

وتحرير: فما باللك، وضرب المصفوفات تفعل أيضا. كل ما تحتاجه هو واحد متجه العمود C وناقلات صف واحد S. ثم القيام C * S.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top