Phép nhân ma trận MATLAB (cách tiếp cận tính toán tốt nhất)


10

Tôi phải thực hiện chuyển đổi tọa độ giữa hai hệ quy chiếu (trục). Do đó, ba ma trận ( ) phải được nhân lên do một số trục trung gian được sử dụng. Tôi đã nghĩ về hai cách tiếp cận để giải quyết điều này:3×3

Phương pháp # 1 : Tạo phép nhân trực tiếp, nghĩa là,

vf= =R1 R2 R3 vTôi

Phương pháp # 2 : Chia thành các bước:

  1. v3Tôi= =R3 vTôi
  2. v23= =R2 v3Tôi
  3. vf= =R1 v23

Ở đâu:

R1 , và là ma trậnR2R33×3

vf , , , là các vectơvTôiv3Tôiv233×1

Tôi muốn biết phương pháp nào hiệu quả hơn về mặt tính toán (ít thời gian hơn) để thực hiện chuyển đổi (điều này sẽ được thực hiện rất nhiều lần).


4
Sử dụng tứ phương .
Chris Taylor

@ChrisTaylor: Cảm ơn bạn rất nhiều vì lời đề nghị của bạn.
julianfperez

2
Xin đừng vượt qua.
Ripped Off

2
Lưu ý, có hai câu hỏi được đăng chéo ở đây và StackOverflow. Các câu hỏi và ý kiến ​​và câu trả lời của họ đã được hợp nhất vào câu hỏi này.
Aron Ahmadia

@ Will và AronAhmadia: Tôi xin lỗi. Tôi không biết việc vượt biên bị cấm. Tôi đã luôn đăng câu hỏi của mình trên StackOverflow nhưng hôm nay tôi đã tìm thấy trang web mới này và tôi nghĩ có lẽ tôi cũng có thể tìm thấy sự giúp đỡ ở đây.
julianfperez

Câu trả lời:


17

Matlab diễn giải các chuỗi nhân và / hoặc chia từ trái sang phải. Do đó là đắt hơn nhiều so Một * ( B * ( C * v ) ) , như bạn có hai sản phẩm ma trận và một sản phẩm ma trận-vecor ở vị trí của ba sản phẩm ma trận vector.Một*B*C*vMột*(B*(C*v))

Mặt khác, nên hơi nhanh hơn nếu bạn tiết kiệm các chất trung gian trong vectơ riêng biệt, như phương pháp thứ hai của bạn gợi ý.Một*(B*(C*v))

Để tìm hiểu chung về cách đo lường tác động của các khác biệt lập trình nhỏ đối với các tính toán quy mô lớn, hãy viết tại dấu nhắc Matlab '' hồ sơ trợ giúp ''.


Cảm ơn bạn cho thông tin thú vị được đưa ra trong câu trả lời của bạn.
julianfperez

Tại sao nó nhanh hơn nếu bạn lưu các trung gian?
Federico Poloni

@FedericoPoloni: Tôi đã viết rằng nó nhanh hơn một chút để không lưu các sản phẩm trung gian.
Arnold Neumaier

@ArnoldNeumaier Ôi xin lỗi tôi đọc sai. :)
Federico Poloni

14

Để bắt đầu, tôi sẽ không sử dụng các biến trung gian, nhưng dấu ngoặc. Tất nhiên trừ khi bạn quan tâm đến kết quả trung gian, nhưng tôi đoán là không.

Tôi đã thử như sau trong Matlab:

>> N = 500;                                             
>> A = rand(N); B = rand(N); C = rand(N); v = rand(N,1);

>> tic, for k=1:100, A*B*C*v; end; toc
Elapsed time is 3.207299 seconds.

>> tic, for k=1:100, A*(B*(C*v)); end; toc
Elapsed time is 0.108095 seconds.

Mặc dù vậy, tôi phải nói rằng điều này khá đáng sợ. Tôi đã luôn cho rằng Matlab sẽ thông minh về thứ tự nhân ma trận, vì đây là một vấn đề đã biết với một giải pháp đơn giản và hiệu quả.


Bạn đã bỏ lỡ phần mà ma trận là 3x3? :)
Aron Ahmadia

2
@AronAhmadia: Rất tiếc ... Đã bỏ lỡ điều đó, cảm ơn. Tôi đoán đối với các kích thước ma trận đó, toàn bộ vấn đề là tranh luận, nhưng tôi vẫn ngạc nhiên về kết quả của N.
Pedro

7
Tôi đoán MATLAB đang tuân theo các quy tắc ưu tiên C để đánh giá biểu thức vì toán học dấu phẩy động không liên quan và chúng phải cho rằng bạn biết bạn đang làm gì :)
Aron Ahmadia

2
@Pedro: Cảm ơn câu trả lời của bạn. Đối với kích thước ma trận 3x3 tôi đã kiểm tra rằng giải pháp của bạn cũng tốt hơn so với phép nhân ma trận thông thường (không có dấu ngoặc).
julianfperez

+1 cảm ơn bạn đã chỉ ra cách đơn giản và dễ dàng để đo thời gian chạy
Steven Magana-Zook

14

Vì các ma trận rất nhỏ, nên tất cả các chi phí sẽ nằm trong chi phí cuộc gọi. Nếu bạn sẽ thực hiện chuyển đổi nhiều lần, sẽ nhanh hơn để tính toán trước D=A*B*Cmột lần và sau đó cho mỗi vectơ được áp dụng v_f=D*v_i. Bạn cũng có thể xem xét đưa cái này ra một tệp mex.


Cảm ơn về câu trả lời của bạn. Trong trường hợp của tôi, ma trận là các ma trận quay (chúng phụ thuộc vào giá trị góc và điều này thay đổi) vì vậy sản phẩm A B C không phải lúc nào cũng giống nhau.
julianfperez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.