From: Dave Smith on
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
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
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
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
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))