Twoje komentarze

Are you sure? I have checked it several times. How it doesn't work?

Dear Michal,

Thank you very much for your report. Please try new version: http://goo.gl/pMXV3

Please let me know if you see any issues with the newest version of toolbox on Windows.

The reason is that TMW has switched to the newest version of Intel OpenMP library (5.0) on Windows in 2020b.

Intel OpenMP library cannot be statically linked into the MEX. That is why toolbox must use the OpenMP which is shipped with MATLAB. This is very painful because different versions of MATLAB use different versions of OpenMP - and hence we must keep compatibility with all this spectrum :)

There are no such issues on GNU Linux and MacOSX. On these platforms we maintain our own version of GCC, with all libraries statically linked (including OpenMP). This gives us freedom from what MATLAB is using.

Thank you

Michal,


Thank you very much for all your support over the years!

Please spread the word about toolbox on other forums, among colleagues, employers, etc. 

As a non-profit company, word-of-mouth is the only marketing we can afford :).

Thank you!

Pavel.

Your question is not clear. "Speed-up" compared to what?

If we would compare it to VPA then we see ~53 times speed-up:

>> A = vpa(rand(1000));
>> x = vpa(rand(1000,1));
>> tic; y = A*x; toc;
Elapsed time is 1.143934 seconds.
>> A = rand(1000,'mp');
>> x = rand(1000,1,'mp');
>> tic; y = A*x; toc;
Elapsed time is 0.021398 seconds.

We use quicksort algorithm, which is pretty much de-facto standard in all programming languages.

If we compare sort speed of our toolbox and VPA: 


>> A = vpa(rand(10000,1));
>> tic; sort(A); toc;
Elapsed time is 0.065205 seconds.

>> A = rand(10000,1,'mp');
>> tic; sort(A); toc;
Elapsed time is 0.003493 seconds.

So, our toolbox is ~19 times faster.

This means that function returned array of cells, each cell is a "mp" number. 
There is nothing wrong with it, you can use/see the actual number by  ans{1:2} or other indexing.

Why arrayfun returns the cell array in case of mp([1 2]) is a mystery, we will investigate it in more detail. I guess it is specific for non-standard types (like "mp"). 

Toolbox provides arrayfun and it works with mp variables. Do you have any issues using it? Please provide minimal and reproducible example of the issue.

>> S(1).f1 = rand(1,5,'mp');
>> S(2).f1 = rand(1,10,'mp');
>> S(3).f1 = rand(1,15,'mp');
>> A = arrayfun(@(x) mean(x.f1),S)

A =

0.5690631027410031794744327271473594 0.6602111831687765719500760042137699 0.4687452915777556405885206913808361

>> A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)

A =

1×3 cell array

{1×1 mp} {1×1 mp} {1×1 mp}

If your matrices are 2D then you can use special functions from toolbox: mp.write/mp.read 

They save matrices in text form, this can be transferred across different platforms (run "doc mp.write" for more information).

Another important thing is to make sure toolbox is loaded by MATLAB before you try to read the "MAT" file with mp-matrices.

Setup precision mp.Digits() or run other command to load the toolbox in MATLAB. Then read "MAT" file. This way MATLAB will understand the type "mp".

The eigs produced wrong result / shows error because it didn't handle such small matrices (up to now).

Krylov iteration methods are robust when search subspace is large ( > max(2*evals,20)). That is why eigs must switch to full QR to compute spectrum of matrices smaller than some threshold. This safeguard was not included in the toolbox up to this moment.

I have just added this workaround to the mpeigs.m.  I will send you new mpeigs.m by email in a few minutes. Just copy it to the toolbox directory (overwrite the old file).  Next toolbox versions will include the new mpeigs.m in the bundle.

P.S.

This kind of special cases (small matrices, small K, special structure) - are not indicative of eigs performance on large/real-life matrices. Because all of these are corner cases, which are handled accordingly by separate codes. 

The only way to be confident is to check math. properties of the results, e.g.:

mp.Digits(34);
A = sparse(eye(4,'mp'));
[V,D] = eigs(A);
norm(A*V - V*D,1)/norm(A,1)