Câu hỏi liên quan

0 Phiếu
0 Câu trả lời
0 Phiếu
4 Câu trả lời
0 Phiếu
4 Câu trả lời
0 Phiếu
0 Câu trả lời
0 Phiếu
4 Câu trả lời

bsxfun thực hiện trong matrix nhân


0 Phiếu
Đã hỏi 23/5/2016 bởi compelling (650 điểm)
Như luôn luôn cố gắng để tìm hiểu thêm từ bạn, tôi hy vọng tôi có thể nhận được một số giúp đỡ với đoạn mã sau này. Tôi cần phải thực hiện như sau: 1) tôi có một vector:
x = [1 2 3 4 5 6 7 8 9 10 11 12]
2) và một ma trận:
A =[11    14    1
    5     8    18
    10    8    19
    13    20   16]
tôi cần để có thể nhân each value x với every value A, điều này có nghĩa là:
new_matrix = [1* A
              2* A
              3* A
               ...
              12* A]
, điều này sẽ cung cấp cho tôi new_matrix này về kích thước (12*m x n) giả định A (mxn). Và trong (12*4x3) case này làm thế nào tôi có thể làm điều này bằng cách sử dụng bsxfun từ matlab? và, method này sẽ nhanh hơn so với một for-loop? Liên quan đến for-loop của tôi, tôi cần một số trợ giúp ở đây cũng... Tôi không thể để lưu trữ mỗi "new_matrix" như loop chạy :(
for i=x
new_matrix = A.*x(i)
end
cảm ơn trước! EDIT: sau khi các giải pháp trong trường hợp được đưa ra giải pháp đầu tiên
clear all
clc
x=1:0.1:50;
A = rand(1000,1000);
tic
val = bsxfun(@times,A,permute(x,[3 1 2]));
out = reshape(permute(val,[1 3 2]),size(val,1)*size(val,3),[]);
toc
đầu ra:
Elapsed time is 7.597939 seconds.
giải pháp thứ hai
clear all
clc
x=1:0.1:50;
A = rand(1000,1000);
tic
Ps = kron(x.',A);
toc
đầu ra:
Elapsed time is 48.445417 seconds.

4 Câu trả lời

0 Phiếu
Đã trả lời 03/6/2016 bởi Lbh9978 (520 điểm)
 
Câu trả lời hay nhất
The kron function does exactly that:
kron(x.',A)
Đã bình luận 05/6/2016 bởi Environment (610 điểm)
@ SergioHaram cảm ơn bạn đã gửi câu hỏi này! Hy vọng rằng điều này sẽ đến tiện dụng cho những người quan tâm đến 'bsxfun'.
0 Phiếu
Đã trả lời 03/6/2016 bởi lrg4768 (150 điểm)
Gửi x cho kích thước thứ ba, do đó mở rộng singleton sẽ có hiệu lực khi bsxfun được sử dụng cho phép nhân với A, mở rộng sản phẩm kết quả vào chiều thứ ba. Sau đó, thực hiện phép nhân bsxfun -
val = bsxfun(@times,A,permute(x,[3 1 2])) 
bây giờ, val3D matrix và output mong muốn dự kiến sẽ là một matrix 2D nối dọc theo các cột thông qua kích thước thứ ba. Điều này đạt được dưới đây -
out = reshape(permute(val,[1 3 2]),size(val,1)*size(val,3),[])
hy vọng rằng làm cho ý nghĩa! Lây lan từ bsxfun xung quanh! Woo!! :)
Đã bình luận 03/6/2016 bởi bugaboos (200 điểm)
Cho vòng lặp có thể được thực hiện bởi predefining của bạn 'new_matrix' trong kích thước của ' (12 * m, n)' như bạn nói cho mình và sau đó bằng cách sử dụng chỉ số cho biết 'new_matrix' của bạn nơi bạn muốn các yếu tố này lưu, ví dụ như trong code của bạn đưa ra ở trên ' new_matrix(((i-1)*12+1):(i*12))) = A.*x(i)' tôi đã viết nó chỉ ở đây như vậy không chắc chắn nếu nó hoạt động.
+1 Phiếu
Đã trả lời 03/6/2016 bởi Jvg_32 (300 điểm)
Gửi x cho kích thước thứ ba, do đó mở rộng singleton sẽ có hiệu lực khi bsxfun được sử dụng cho phép nhân với A, mở rộng sản phẩm kết quả vào chiều thứ ba. Sau đó, thực hiện phép nhân bsxfun -
val = bsxfun(@times,A,permute(x,[3 1 2])) 
bây giờ, val3D matrix và output mong muốn dự kiến sẽ là một matrix 2D nối dọc theo các cột thông qua kích thước thứ ba. Điều này đạt được dưới đây -
out = reshape(permute(val,[1 3 2]),size(val,1)*size(val,3),[])
hy vọng rằng làm cho ý nghĩa! Lây lan từ bsxfun xung quanh! Woo!! :)
Đã bình luận 05/6/2016 bởi Really_Pyke (100 điểm)
Kool! Một số điểm chuẩn kết quả!! Cảm ơn bạn đã gửi bài những người!
0 Phiếu
Đã trả lời 03/6/2016 bởi Wont6557 (240 điểm)
Nếu véc tơ của bạn x chiều dài = 12 và matrix của bạn kích thước 3 x 4, tôi không nghĩ rằng bằng cách sử dụng một hay khác sẽ thay đổi nhiều trong thuật ngữ của thời gian. Nếu bạn đang làm việc với cao kích thước matrix và véc tơ, mà có thể trở thành một vấn đề. Vì vậy trước tiên, chúng tôi muốn nhân lên một vectơ với một ma trận. Trong phương pháp cho vòng lặp, mà sẽ cung cấp cho một cái gì đó như thế:
s = size(A);
new_matrix(s(1),s(2),numel(x)) = zeros;   %This is for pre-allocating. If you have a big vector or matrix, this will help a lot time efficiently.
for i = 1:numel(x)
    new_matrix(:,:,i)= A.*x(i)
end
này sẽ cung cấp cho bạn ma trận 3D, với mỗi chiều thứ 3 là kết quả của phép nhân của bạn. Nếu điều này không phải là những gì bạn đang tìm kiếm, tôi sẽ có thêm một giải pháp khác có thể là thêm thời gian hiệu quả với các lớn hơn khuôn nổi và vector.
Đã bình luận 04/6/2016 bởi Nal_3850_d (110 điểm)
Cảm ơn, tôi sẽ kiểm tra nếu nó hoạt động và tôi sẽ cho bạn biết!
Đã bình luận 04/6/2016 bởi fbeAbdur (100 điểm)
Nó hoạt động hầu như chỉ, tôi nhận được một cái gì đó ở giữa ' 1 * new_matrix', ' 2 * new_matrix' ' 3 * new_matrix'.. v.v. một số tính toán khác mà tôi không thể cho biết nơi họ đến từ.

ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...