# How to write diagonal matrix in deep learning array

5 views (last 30 days)
Commented: Muhammad on 17 Jan 2024
I have this matrix
D = zeros(M, M + 1);
D(1:end-1, 1:end-2) = diag((1/(2*h)) * ones(M-1, 1));
D(1:end-1, 3:end) = diag((-1/(2*h)) * ones(M-1, 1));
D(end, end-1:end) = (1/h) * [1,-1];
and I am writing this in a deep learning dlarray. But I am getting this below error
Undefined function 'diag' for input arguments of type 'dlarray'.
what is the best or another way to write this diagonal matrix for dlarray?
Dyuman Joshi on 16 Jan 2024
"what is the best or another way to write this diagonal matrix for dlarray?"
Simply define the array first as you have and then convert using dlarray. No need of using a for loop.
M = 10;
h = 5;
D = zeros(M, M + 1);
D(1:end-1, 1:end-2) = diag((1/(2*h)) * ones(M-1, 1));
D(1:end-1, 3:end) = diag((-1/(2*h)) * ones(M-1, 1));
D(end, end-1:end) = (1/h) * [1,-1];
D
D = 10×11
0.1000 0 -0.1000 0 0 0 0 0 0 0 0 0 0.1000 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0.2000 -0.2000
E = dlarray(D)
E =
10×11 dlarray 0.1000 0 -0.1000 0 0 0 0 0 0 0 0 0 0.1000 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0 0 -0.1000 0 0 0 0 0 0 0 0 0 0.2000 -0.2000
Thank you

Hassaan on 16 Jan 2024
The diag function is indeed not defined for dlarray types in MATLAB. To create a diagonal matrix for dlarray, you can manually construct the diagonal elements and then use indexing to place them in the appropriate positions.
For the dlarray type, you'll need to use standard MATLAB operations that are compatible with dlarray objects. Here's an alternative approach:
% Assuming M and h are defined
M = 10; % example value
h = 0.1; % example value
% Create a dlarray filled with zeros
D = dlarray(zeros(M, M + 1));
% Create the main diagonal elements for the first part
main_diag1 = (1/(2*h)) * ones(M-1, 1);
% Assign the main diagonal elements to the dlarray
for i = 1:M-1
D(i, i) = main_diag1(i);
D(i, i+2) = -main_diag1(i);
end
% Assign the values to the last row
D(M, M) = (1/h);
D(M, M+1) = -(1/h);
Note that in the above code, I've used a for-loop to assign the values to the dlarray D. This is necessary because dlarray does not support the diag function directly. However, it does support element-wise assignment and mathematical operations.
The loop iterates over the first M-1 rows to create the desired pattern in the matrix. It assigns positive values on the main diagonal and negative values on the diagonal starting at column 3. For the last row, the values are assigned directly.
Keep in mind that operations on dlarray objects must be compatible with the deep learning functions in MATLAB, and only a subset of MATLAB functions can be used with dlarray objects. If you need to perform operations that are not directly supported, you may need to convert the dlarray back to a regular MATLAB array using the extractdata function, perform the operation, and then convert it back to dlarray. However, in this case, such a conversion is not necessary.
------------------------------------------------------------------------------------------------------------------------------------------------
If you find the solution helpful and it resolves your issue, it would be greatly appreciated if you could accept the answer. Also, leaving an upvote and a comment are also wonderful ways to provide feedback.
Professional Interests
• Technical Services and Consulting
• Embedded Systems | Firmware Developement | Simulations
• Electrical and Electronics Engineering
Feel free to contact me.