2017-05-06 64 views
1

我有一個通過迭代計算獲得的標量函數。我希望區分(找到方向導數)的值相對於矩陣元素。在這種情況下,我應該如何使用有限差分近似。在這種情況下,diffgradient有幫助。請注意,我只需要數值導數。 典型的代碼,我會努力的是:微分矩陣的標量

n=4; 
for i=1:n 
    for x(i)=-2:0.04:4; 
    for y(i)=-2:0.04:4; 
     A(:,:,i)=[sin(x(i)), cos(y(i));2sin(x(i)),sin(x(i)+y(i)).^2]; 
     B(:,:,i)=[sin(x(i)), cos(x(i));3sin(y(i)),cos(x(i))]; 
     R(:,:,i)=horzcat(A(:,:,i),B(:,:,i)); 
     L(i)=det(B(:,:,i)'*A(:,:,i)B)(:,:,i)); 

     %how to find gradient of L with respect to x(i), y(i) 
     grad_L=tr((diff(L)/diff(R)')*(gradient(R)) 
    endfor; 
    endfor; 
endfor; 

我知道,grad_L最後一部分將語法錯誤說法的尺寸不匹配。我該如何着手解決這個問題。注意矩陣變量X給出的標量函數的f該梯度或方向導數由nabla(f)=trace((partial f/patial(x_{ij})*X_dot其中x_{ij}表示矩陣的元素和X_dot表示矩陣的梯度X

+0

@Adriaan確定,編輯。但是,這只是一個假設的例子。 – vidyarthi

回答

1

兩個代碼,並解釋是非常混亂。您正在使用n = 4的迭代,但對輸入或輸出不做任何處理,並且會覆蓋所有內容。所以我現在將忽略n方面,因爲你似乎沒有使用它。此外,你有許多語法錯誤,看起來更像是數學或僞代碼,而不是任何寫出有效的Matlab/Octave的嘗試。

但是,本質上,你似乎在問:「我有一個函數,它對於2D網格上的每個(x,y)座標,計算一個標量輸出L(x,y)到L包括乘以兩個矩陣,然後得到它們的行列式。以下是如何產生這樣的陣列L

X = -2 : 0.04 : 4; 
Y = -2 : 0.04 : 4; 
X_indices = 1 : length(X); 
Y_indices = 1 : length(Y); 

for Ind_x = X_indices 
    for Ind_y = Y_indices 
    x = X(Ind_x); y = Y(Ind_y); 
    A = [sin(x), cos(y); 2 * sin(x), sin(x+y)^2]; 
    B = [sin(x), cos(x); 3 * sin(y), cos(x) ]; 
    L(Ind_x, Ind_y) = det (B.' * A * B); 
    end 
end 

您然後要獲得L,其中,當然,是一個矢量輸出的梯度。現在,爲了獲得這個,忽略你提到的數學,如果你基本上試圖正確使用gradient函數,那麼你直接使用它到L,並指定用於它的網格XY來指定間距在L的不同元件之間,並且收集其作爲兩元件陣列輸出,這樣就同時捕獲的xy梯度的矢量的分量:

[gLx, gLy] = gradient(L, X, Y); 
+0

感謝您的回覆。但是我希望只計算一個變量的梯度,所以我需要做些什麼改變? – vidyarthi

+0

和你一樣,你只對'gLx'組件感興趣? (或僅在'gLy'組件中) –

+0

是的,我對這兩個組件分別感興趣 – vidyarthi