# bug #65424: svds(A) returns singular values in reversed order for complex A

 Submitter: None Submitted: Wed 06 Mar 2024 07:17:42 PM UTC Category: Octave Function Severity: 3 - Normal Priority: 5 - Normal Item Group: Matlab Compatibility Status: Confirmed Assigned to: None Originator Name: Angelika i Originator Email: -email is unavailable- Open/Closed:  * Open Release:  * 8.4.0 Operating System:  * Any Fixed Release: None Planned Release: None
* Mandatory Fields

Add a New Comment Rich Markup

## Discussion

Sat 09 Mar 2024 05:03:22 AM UTC, comment #3:

The algorithm switching is probably based on whether a full decomposition is requested (3 output argument) or just the singular values themselves (1 output argument).  Both svds (z) and svds (z,2) sort the singular values in descending order when there is only one output.

Rik <rik5>
Fri 08 Mar 2024 08:49:13 PM UTC, comment #2:

svds(z,2)

breaks the integer example.

I suspect that there is an algorithm switch. When the full SVD is sought, some other routine such as svd() is called. By default, the leading 6 singular values are returned, i.e., svds(A) without additional arguments seeks a full SVD when n <= 6.

Best,
Angelika

Anonymous
Thu 07 Mar 2024 09:18:15 PM UTC, comment #1:

Confirmed.  Changing Item Group to "Matlab Compatibility".

Additional information, svds() can return just the singular values, rather than the full decomposition.  When only one output is requested, Octave does return a list sorted in descending order.

Secondly, not all complex matrices are sorted in ascending order.  The example below (generated with random integers), works.

x = [
35   19   41   29
25    4   30   50
55   49    5   37
59   47   22    9
];

y = [
63   53    1   33
13   38   24   17
20   54   32   57
25   17   60   59
];
z = complex (x,y);

[U,S,V] = svds (z)

Rik <rik5>
Wed 06 Mar 2024 07:17:42 PM UTC, original submission:

svds() returns the singular values in ascending order for complex matrices. By definition, the singular values should appear in descending order.

Reproducer:

n = 8;
A = rand(n,n) + 1i * rand(n,n);
[U, S, V] = svds(A);
diag(S)  % sorted from small to large, should be sorted from large to small

Notes:
(1) For a real input matrix A, the singular values are sorted as expected in descending order.
(2) svds() in Matlab 2022 returns S in descending order for both real and complex matrices.

Anonymous

## Attached Files

(Note: upload size limit is set to 16384 kB, after insertion of the required escape characters.)

Attach Files:

Comment:

No files currently attached

## Dependencies

Depends on the following items: None found

Items that depend on this one: None found

Carbon-Copy List
• -email is unavailable- added by rik5 (Posted a comment)
• -email is unavailable- added by None (Submitted the item)
•

There are 0 votes so far. Votes easily highlight which items people would like to see resolved in priority, independently of the priority of the item set by tracker managers.

Only group members can vote.