- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
I'm trying to write the equivalent of this matlab code in F#, with ILP64 MKL:
S = temp + (I - diag(diag(temp)))
where S, temp are matrices in Rn, I is the identity matrix in Rn, and diag(diag(temp)) is the matrix containing only the main diagonal of temp
In other words, given the matrix
[ a b c
d e f
g h i ]
I want the result
[1 b c
d 1 f
g h 1 ]
for any square sparse matrix.
I think I can perform part of this operation using mkl_dcsrmv, which computes
y := alpha*A*x + beta*y
where x and y are the values array of the identity matrix, alpha is -1.0 and beta is 1.0. According to the manual, I can operate on the diagonal by setting the first element of matdescra to 'D'.
Given the matrix
[1 2 3
4 5 6
7 8 9 ]
my calculation correctly returns the vector [-5 -14 -3] for a General matrix, but when I set matdescra(1) to D, I get [1 1 1] where I expect [0 -4 -8]
It's as though setting matdescra(1) to 'D' returns, not the main diagonal of my matrix, but [0 0 0].
I include some F# code that reproduces the issue, error handling and memory cleanup elided.
let test_dcsrmv (structure:char) =
let p x = PinnedArray.of_array x
let mutable transOption = 'N'
let mutable m = 3
let mutable k = 3
let mutable alpha = -1.0
let mutable beta = 1.0
let madescra = [| structure; '_'; 'N'; 'F'|] |> PinnedArray.of_array
let indx = p [|1; 2; 3;
1; 2; 3;
1; 2; 3; |]
let vals = p [|
1.0; 2.0; 3.0;
4.0; 5.0; 6.0;
7.0; 8.0; 9.0; |]
let pntrb = p [|1; 4; 7;|]
let pntre = p [|4; 7; 10|]
let x = p [| 1.0; 1.0; 1.0 |]
let y = [| 1.0; 1.0; 1.0 |]
let y_handle = p y
mkl_dcsrmv(&&transOption, &&m, &&k, &&alpha, madescra.Ptr, vals.Ptr, indx.Ptr, pntrb.Ptr, pntre.Ptr, x.Ptr, &&beta, y_handle.Ptr)
y
let general = test_dcsrmv 'G' // returns [-5 -14 -23]
let diagonal = test_dcsrmv 'D' // returns [1 1 1]
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi, let me give this some though and I will get back to you.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
It's a really interesting question how using MKL functionality without direct work with arrays change a diagonal of matrix... Nevertheless your approach a bit incorrect, you try to use
y := alpha*A*x + beta*y
where x and y are the values array of the identity matrix, alpha is -1.0 and beta is 1.0
but it is equal to Y=1.*A-1*I =
[1 2 3 ] [1 0 0 ] [0 2 3 ] [1 2 3 ]
[4 5 6 ] - [0 1 0 ] = [4 4 6 ] != [4 1 6 ]
[7 8 9 ] [0 0 1 ] [7 8 8 ] [7 8 1 ]
The parameter 'D' & 'G' in your program specify characteristic of matrix "vals" as diagonal matrix or general - in you example 'G' is more correct.
Currently i don't see the way how to change one diagonal of matrix using SparseBals functionality only but I will investigate it. Is it possible to provide the reason of such request? Is it possible to provide additional information about it - based on it we could provide some suitable workaround of implementation such algorithm. If it is a kind of secret you can write to me in private post.
With best regards,
Alexander Kalinkin
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page