Skip to main content

linear algebra - What if do NOT want Mathematica to normalize eigenvectors with Eigenvectors[N[matrix]]?


ORIGINAL QUESTION


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$.


EDIT


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.




Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

Is there a way to do conditional matrix loop using 'continue'

I have the following: n = 3; m = 5; ww = RandomReal[{0, 0.1}, {n, n}]; uu = RandomReal[{0, 1}, {m, n}]; pp = RandomReal[{0, 1}, {n, n}]; ss = RandomInteger[{0, 5}, {m, n}]; Grid[{{"ww", "uu", "pp", "ss"}, {ww // TableForm, uu // TableForm, pp // TableForm, ss // TableForm}}, Spacings -> {5, 2}, Dividers -> All] where I would like to look at every element of matrix ss and produce a matrix tt , with zeroes at the locations in ss which have zeroes, and in all other positions do the following: tt = (-1/Subscript[ww, m]) Log[(1 - uu)/(Subscript[pp, m - 1])], where Subscript[ww, m] is the value at index of ww matrix and where Subscript[pp, m - 1] is the value at index-1 of pp matrix. So for example if the first value ever read from matrix ss happens to be 2, then value taken from matrix ww would be from the row 2, but from pp would be from row 1. Also how to tell difference between a 0 as a valid value from within the matrix elemen...