Prev: Inegrating systems with changing spring rate
Next: index must be a positive integer or logical.
From: Dave Smith on 8 Mar 2010 01:46 dpb <none(a)non.net> wrote in message <hn1tb3$pos$1(a)news.eternal-september.org>... > Dave Smith wrote: > > dpb <none(a)non.net> wrote in message > > <hn0uph$jl1$1(a)news.eternal-september.org>... > >> Dave Smith wrote: > >> > dpb <none(a)non.net> wrote in message > > >> <hn0k4h$9c1$1(a)news.eternal-september.org>... > >> ... > >> > >> > Thank you. This is very close to what i wanted but can you explain > >> what > is rand(size(x)) do? > >> Just generated a set of random numbers to start w/ of the same size as > >> x... > >> > >> ... > >> > >> > a horizontal line and a vertical line going down from 2 and then > >> another > horizontal line from 2-3. I hope you understand what I'm > >> trying to said. > >> > >> Yeah, you'll have to duplicate the x-coordinates at the break points > >> which the above doesn't do (didn't think thru the issue thoroughly > >> enuf before, sorry). > >> > >> The fundamental idea is the same, just that you'll have to have the x > >> and y vectors contain the entries for both the (replicating) abcissa > >> and ordinates to draw a true square wave. What I showed would be a > >> triangle, indeed. > >> > >> Of course, a true square wave is an idealization anyway, no matter how > >> good the rise/fall time of a wave generator... :) > >> > >> If you perchance have the Signal Processing toolbox, it has a square() > >> function but it is "realizable" in the above sense as it doesn't > >> generate values at duplicated time points, either. > >> > >> -- > > > > duplicate x-coordinates? can you help me out, I been struggling with > > this all day, so frustrating > > Well, you have to decide the on/off positions but you need something like > > x = [ 0 1 2 2 3 4 5 5 6 7 8 8 9 10 ]; > y = [ -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 1 ]; > plot(x,y) > axis([0 10 -2 2]) % fix y-axis so can see clearly now... > > The trick is to determine programmatically what are the breakpoints > where you need the duplicated x values to create the vertical > transition. (Assuming that is what you really want irrespective of the > realizability issues raised earlier) > > -- Ok, I have test the duplicating x values and yes this is what I wanted. But now the trick like you said is to determine the breakpoints. Here is what I have so far: XMIN=1; XMAX=12; YMIN=-2; YMAX=2; B=[0 1 0 0 1 1 0 0 0 1 1]; [row,column]=size(B); for c=1:column; if B(c)==1; B(c)=-1; end if B(c)==0; B(c)=1; end end B(12)=B(11); X=(1:11); subplot(3,1,1); plot(X,B); axis([XMIN XMAX YMIN YMAX]); I wanted the program to read the B matrix and if it see a 1, it will goes -1 and if it see a 0, it will goes 1. I had determine that everytime it switches between 0 and 1, I need to deplicate that x values and add that many to the matrix. For example, right now it's 12 and it changes from 1 to 0 or 0 to 1 5 times so I need to add 5 + 12 = 17 so in the end. it's a 17 columns matrix. I thought about it but I need some suggestion on what to do.
From: dpb on 8 Mar 2010 09:31 Dave Smith wrote: .... > Ok, I have test the duplicating x values and yes this is what I wanted. > But now the trick like you said is to determine the breakpoints. Here is > what I have so far: > .... > B=[0 1 0 0 1 1 0 0 0 1 1]; .... > I wanted the program to read the B matrix and if it see a 1, it will > goes -1 and if it see a 0, it will goes 1. Well, that part's simple enough... B(B==0)=-1; B(B==1)=1; .... > everytime it switches between 0 and 1, I need to deplicate that x values > and add that many to the matrix. For example, right now it's 12 and it > changes from 1 to 0 or 0 to 1 5 times so I need to add 5 + 12 = 17 so in > the end. it's a 17 columns matrix. I thought about it but I need some > suggestion on what to do. look at doc diff and see if that doesn't give you any ideas on how to determine where to insert the added points... --
From: Walter Roberson on 8 Mar 2010 10:29 Dave Smith wrote: > Ok, I have test the duplicating x values and yes this is what I wanted. > But now the trick like you said is to determine the breakpoints. Here is > what I have so far: Was there a problem with the two-line solution I suggested?
From: Dave Smith on 8 Mar 2010 10:46 Walter Roberson <roberson(a)hushmail.com> wrote in message <hn3549$pig$1(a)canopus.cc.umanitoba.ca>... > Dave Smith wrote: > > > Ok, I have test the duplicating x values and yes this is what I wanted. > > But now the trick like you said is to determine the breakpoints. Here is > > what I have so far: > > Was there a problem with the two-line solution I suggested? No, there were no problem actually. I just never got a chance to try your suggestion as I was busy spending hours on trying to duplicated the x-axis going by what dpb suggested. But your suggestion solved the problem the moment I tried it so thank you very much. Can you explain to me in as much details as possible on how those two lines worked? I looked up reshape and repmat in help file but I still don't fully understand it. This is just one type of scheme graphs I have to do, I still got 6 other more to do and I don't know if these two lines will work for them all so that is why I would like to understand the code.
From: Walter Roberson on 8 Mar 2010 11:37 Dave Smith wrote: > Walter Roberson <roberson(a)hushmail.com> wrote in message > <hn3549$pig$1(a)canopus.cc.umanitoba.ca>... >> Was there a problem with the two-line solution I suggested? > No, there were no problem actually. I just never got a chance to try > your suggestion as I was busy spending hours on trying to duplicated the > x-axis going by what dpb suggested. But your suggestion solved the > problem the moment I tried it so thank you very much. Can you explain to > me in as much details as possible on how those two lines worked? I > looked up reshape and repmat in help file but I still don't fully > understand it. This is just one type of scheme graphs I have to do, I > still got 6 other more to do and I don't know if these two lines will > work for them all so that is why I would like to understand the code. Consider the x coordinates. If you start from a baseline (0 in the case of the code) then you need the initial x value (1) for that, and then you need the same x value to draw the up (or down) stroke to reach the first y value. Then you will need the 2nd x value to draw the line across to the second value, and the 2nd x again to draw the up or down stroke to the second y value. Keep going in this manner, with 2 copies of each x coordinate. When you reach the last y value, you have an implicit draw across _past_ that y value to where the next y value would start, and you have an implicit return to baseline, so you will need two copies of the x coordinate which is length(y)+1 . Thus, what we do is construct (1:length(y)+1), then we use repmat(,2,1) two take an identical copy of that row. Matlab stores values down columns, so _in memory_ the adjacent values at this point will be two copies of each of the x coordinates. We could use a temporary variable to hold that and then use (:) indexing to "unravel" that down the columns to x1 x1 x2 x2 etc., or we can do like I did and call reshape explicitly to do the unravelling. reshape(,1,[]) means to take the data that is in memory and change its dimensions to 1 by "however much you need", so after the reshape, we wil be left with x1 x1 x2 x2 .... xn xn xn+1 xn+1 . Now consider the y coordinates. Because we are starting from the baseline, the adjusted y coordinates will need to start with a 0; likewise because we return to the baseline at the end, they will need to end with 0. That accounts for the [0 <something> 0] portion of the code. Now, we need to draw the upstroke or downstroke to reach the first y value, so the first y value comes next. We need to hold that y value over to the next x value, so a duplicate of the first y value is needed. After that, we need to draw up or down to the second y value, and then need to hold that value to the next x coordinate, and so on. Thus we are once more in the situation of needing to duplicate a vector y1 y2 y3 to become y1 y1 y2 y2 y3 and so on, which uses the same duplication code as we used for the x. But in the x case, we know that 1:length(y)+1 will generate a row vector, but for the purposes of this two-liner, we cannot assume that y is already a row vector. To force y to be a row vector, we use y(:) which forces y to be a _column_ vector; once we have the column vector, we repmat(,1,2) it to make a duplicate column, and then we use ..' to transpose it into two identical row vectors; the reshape(,1,[]) then converts it into a single long row vector. Then the [0 ... 0] wrapper for the returns to baseline. The length of the newy vector thus becomes 1 + 2*length(y) + 1, which is 2*length(y) + 2, which is 2*(length(y)+1) which is the same as for the newx vector, so we have all the coordinates matched up. This isn't the _optimal_ drawing for the line, but that probably doesn't matter. If it does matter, then because the structure of it is so clear, it should be fairly straight-forward to filter out redundant points; I would suggest first removing the redundant up/down strokes (which will show up as identical pairs of x and y coordinates adjacent to each other), and then to remove the redundant x coordinates (which would show up as (x1 y1) (x2 y1) (x3 y1), which is compressible to (x1 y1) (x3 y1))
First
|
Prev
|
Next
|
Last
Pages: 1 2 3 4 Prev: Inegrating systems with changing spring rate Next: index must be a positive integer or logical. |