Question speaks for itself. Mathematica normalizes the eigenvectors automatically when you type Eigenvectors[N[matrix]]. What if I do NOT want the vectors to be normalized? I looked around and found that N[Eigenvectors[matrix]] would in principle do the trick. I mean, that is the form I would like to have them expressed. However, I can't do it because I get this message (which by the way I don't fully grasp):

"Incorrect number 20 of eigenvectors for eigenvalue 1/2 (-1+Sqrt[5]) with multiplicity 2."

The size of the matrix is $2^8$ by $2^8$.


I see that there's some confusion on what I am asking. Obviously, as any (nonzero scalar) multiple of an eigenvector is equivalent to the same eigenvector, my question is not making that much sense the way it is asked. Apologies for that, I asked in a rush. I will try to put in context what I am doing so that maybe it will be more clear what my point is.

I have a $2^8$ by $2^8$ matrix, call it $H$. I want to construct the matrix $Q$ which is the linear combination of the density matrices (projectors) coming from the eigenvectors of $H$ weighted by some coefficients $c_j$. In formula, this is:

$Q=\sum_{j=0}^{2^8}c_j v_j^T v_j$

where $v_j$ are the eigenvectors of $H$ and $v^T$ denotes the transpose of $v$. I do not want to specify the $c_j$'s, they remain (possibly complex) variables. I calculate the $v$'s using Eigenvectors[N[H]] because N[Eigenvectors[H]] is both too slow and ineffective (see the error message above).

My point is that when I am doing this, I have entries which are so close to zero that I am not able to recognize which zeroes are actually zeroes and which ones are just due to the precision of my calculation (let's call these ones "numerical zeroes").

How do I know this? I tried to make things simpler and did the same calculation for a smaller matrix, $2^5$ by $2^5$. This time N[Eigenvectors[H]] works well. However, when using Eigenvectors[N[H]] and N[Eigenvectors[H]] I get two very different matrices $Q$. That is of course expected, because of the normalization in Eigenvectors[N[H]]. But what got me was the fact that the number of zero entries in $Q$ is very different in the two cases, namely, there are much more zeroes when I use N[Eigenvectors[H]]. This is of course puzzling, seeing that Mathematica supposedly maintains the same order of the eigenvectors in the two cases. I suspect that that is due to what I called the "numerical zeroes". Chopping is not helping much, because say that one of your entries is of order $10^{-5}$ because of the rescaling of the normalization, then already you will have something of order $10^{-10}$ in $v^T v$. So in principle you don't know if you're chopping something meaningful or not.
So my idea was the following: if I can tell someway Mathematica to NOT normalize the eigenvectors of my matrix, the entries of the eigenvectors won't scale down to small numbers and I could easily distinguish between exact zeroes and "numerical" zeroes and I could Chop nicely.

Also what tells me that something is wrong is that when I take the commutator $[H,Q]$ I get zero in one case and non-zero in the other one. Of course, the right result should be zero by construction.

Another motivation is of course the following: the size of the output I get for $Q$ when using N[Eigenvectors[H]] is WAY less than when I'm using Eigenvectors[N[H]], because the amount of zeroes is much more. We're talking 800 kB vs 100 MB in the $2^5$ case. So when I try to construct $Q$ in the $2^8$ case it takes forever. And seeing that in the future I will need to increase the size exponentially up to $2^{12}$ or more, I have to fix this.

Hope this made it clearer.

  • 8
    $\begingroup$ May I ask how you want the eigenvectors to be scaled? Every eigenvector of a matrix multiplied by any (nonzero) real number is another eigenvector, so any scaling (including unit length scaling) results in valid eigenvectors. $\endgroup$ Commented Mar 17, 2015 at 19:04
  • 1
    $\begingroup$ That message probably indicates a bug. Impossible to tell without input though. $\endgroup$ Commented Mar 17, 2015 at 19:24
  • $\begingroup$ @2012rcampion point is I'm going to perform various calculation and I want to have a quick way of distinguish actual zeroes from numerical zeroes. normalized vectors entries are very small and when you multiply them you already go around machine precision $\endgroup$
    – user50473
    Commented Mar 17, 2015 at 22:42
  • $\begingroup$ @user50473 Chop doesn't work for you? What about _ /. {x_ /; x==0 -> 0}? I also found that using SetPrecision[m, $MachinePrecision] beforehand will return either exact zeros or arbitrary-precision zeros (e.g. 0``15.653...), and will show an error (No significant figures available for display) if there is a loss of precision associated with a cancellation (which is what I assume you mean by "numerical zero"). $\endgroup$ Commented Mar 18, 2015 at 0:24
  • 1
    $\begingroup$ I think the proper way to handle your kind of issue is to rescale the matrix before calculating its eigenvalues, to make it more well-behaved. But in the absence of an actual example, I can't think of a good way to write a useful answer. $\endgroup$
    – Jens
    Commented Mar 18, 2015 at 22:53

1 Answer 1

Times @@ Eigensystem[{{2, 0}, {0, 6}}]

(* {{0, 6}, {2, 0}} *)


Times @@ (N@Eigensystem[{{3, 4}, {1, 2}}])

(* {{11.6847, 4.56155}, {-0.684658, 0.438447}} *)

  • $\begingroup$ David, care to respond to the downvote with a bit of explanation and how this method would scale ? $\endgroup$
    – Sektor
    Commented Mar 17, 2015 at 19:26
  • $\begingroup$ The Eigensystem yields both the eigenvalues and the eigenvectors. The only principled way to get eigenvectors of different magnitude is to scale them according to their eigenvalues. This is precisely what my code achieves. Eigensystem applies to matrices of arbitrary size $r \times r$, of course (given its rank is $r$), though the computation may take a long time. See: mathematica.stackexchange.com/questions/50610/… $\endgroup$ Commented Mar 17, 2015 at 19:36
  • 1
    $\begingroup$ But you might multiply an eigenvector by zero: Times @@ N@Eigensystem[{{28, 21, 9}, {-16, -12, -4}, {-12, -9, -5}}] $\endgroup$
    – Michael E2
    Commented Mar 17, 2015 at 21:26
  • $\begingroup$ @David thanks for the answer, should actually have thought of it myself $\endgroup$
    – user50473
    Commented Mar 17, 2015 at 22:46
  • 2
    $\begingroup$ @user50473 I suppose another point is that the code in this answer does not keep track of those, and so in principle is not particularly good as an answer (i.e., it's buggy). $\endgroup$
    – Michael E2
    Commented Mar 18, 2015 at 0:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.