Tôi gặp sự cố. Tôi đang cố gắng triển khai đoạn mã ngắn này. mở rộng bsxfun để phục vụ cho các chỉ số cụ thể trong ma trận
Các bước cơ bản mà tôi đã thực hiện. Vui lòng kiểm tra mã của tôi dưới đây:
clc;clear all;close all;
A=round(-3+(6).*rand(5,5));
B=round(-3+(6).*rand(5,5));
%//The check matrix stores the conditions present on the right side of the equation.
check = A.*B
%//upd_max and upd_min are the given as the del_max and del_min in the equation
upd_max = 0.5;
upd_min = 0.1;
%//eta_plus and eta_minus are denoted as nplus and nminus
nplus = 1.2;
nminus = 0.5;
%del_(k-1)_i matrix is given as update_mat
update_mat = (0.1+(0.4).*rand(size(check))).*ones(size(check))
update_new = update_mat.*(check==0) + bsxfun(@min,(nplus.*update_mat.*(check>0)),upd_max)...
+ bsxfun(@max,nminus.*(update_mat.*(check<0)),upd_min)
Tôi đưa ra dưới đây là một kết quả mẫu của mảnh của tôi mã:
check =
2 -6 0 -1 2
-3 -4 3 -3 4
0 2 -2 6 0
2 -1 -4 -1 -3
-2 -4 -3 0 6
update_mat =
0.4102 0.4173 0.1126 0.2268 0.4964
0.4622 0.3750 0.4282 0.3422 0.1495
0.4760 0.3820 0.2903 0.3143 0.1473
0.3603 0.2861 0.3122 0.3527 0.2908
0.3602 0.3696 0.3220 0.2046 0.4746
update_new =
0.5922 0.2087 0.2126 0.1134 0.6000
0.2311 0.1875 0.6000 0.1711 0.2794
0.5760 0.5584 0.1452 0.4772 0.2473
0.5324 0.1431 0.1561 0.1763 0.1454
0.1801 0.1848 0.1610 0.3046 0.6000
Tuy nhiên câu trả lời này là không đúng !! Để giải thích Tôi chia câu trả lời của tôi thành ba phần:
update_mat.*(check==0)
ans =
0 0 0.1126 0 0
0 0 0 0 0
0.4760 0 0 0 0.1473
0 0 0 0 0
0 0 0 0.2046 0
bsxfun(@min,(nplus.*update_mat.*(check>0)),upd_max)
ans =
0.4922 0 0 0 0.5000
0 0 0.5000 0 0.1794
0 0.4584 0 0.3772 0
0.4324 0 0 0 0
0 0 0 0 0.5000
Như có thể thấy rõ first
hai nhiệm kỳ là chính xác. Tuy nhiên thuật ngữ thứ ba là sai. Nhiệm kỳ thứ ba đến như thế này:
bsxfun(@max,nminus.*(update_mat.*(check<0)),upd_min)
ans =
0.1000 0.2087 0.1000 0.1134 0.1000
0.2311 0.1875 0.1000 0.1711 0.1000
0.1000 0.1000 0.1452 0.1000 0.1000
0.1000 0.1431 0.1561 0.1763 0.1454
0.1801 0.1848 0.1610 0.1000 0.1000
Thuật ngữ thứ ba chính xác nên cho tôi
0 0.2087 0 0.1134 0
0.2311 0.1875 0 0.1711 0
0 0 0.1452 0 0
0 0.1431 0.1561 0.1763 0
0.1801 0.1848 0.1610 0 0.1000
Tôi muốn bsxfun để tính toán phần tử khôn ngoan tối đa chỉ cho các yếu tố khác không của ma trận nminus.*(update_mat.*(check<0))
và không phải toàn bộ ma trận. nó có khả thi để làm vậy không?
Cảm ơn trước! Tái bút: Vui lòng cung cấp ý tưởng cho mã được tối ưu hóa tốt hơn.
Tôi hiểu ý tưởng của bạn và nó cũng hoạt động! nhưng tôi không thể sử dụng bsxfun để làm điều đó? Khi tôi hiểu nó nhanh hơn đáng kể. – roni
@roni đó không phải là những gì bsxfun làm. Tôi rất nghi ngờ nó sẽ nhanh hơn lập chỉ mục logic. Nó thường nhanh hơn bằng cách sử dụng 'repmat' hoặc vòng lặp nhưng khi bạn đang đối phó với một vô hướng, nó là vô nghĩa. Đây là con đường để đi. – Dan
@roni Bsxfun được sử dụng khi bạn cần mở rộng ** vectơ ** để khớp với thứ nguyên. Với vô hướng là vô nghĩa và thêm vào chi phí. – Oleg