2013-12-13 12 views
6

Tôi gặp sự cố. Tôi đang cố gắng triển khai đoạn mã ngắn này. enter image description heremở 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.

Trả lời

6

Bạn không cần bsxfun kể từ khi bạn đang làm việc với một vô hướng, bạn chỉ cần đánh chỉ số logic:

M=nminus.*(update_mat.*(check<0)) 
M((~~M) & (M < upd_min)) = upd_min %// ~~M is the same as M~=0 

(btw này giả định rằng ví dụ dữ liệu của bạn, bạn đã phạm sai lầm ở hàng cuối cùng thứ hai của cột cuối cùng nơi bạn có 0 nhưng tôi nghĩ bạn muốn 0.1454)

+0

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

+2

@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

+3

@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

Các vấn đề liên quan