Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Create a square array in matlab

  1. Jul 12, 2006 #1
    Hi,

    I realise this is a physics forum, but thought someone may be able to help!

    I would like to create a square array i.e 4x4 and then plot a vector of data (16 elements) over this 4x4 array.

    I have created the following code, it doesnt work but thats what I am ideally aiming after:

    [X,Y] = meshgrid([1:1:4]);

    z = [30 20 20 30 20 10 10 20 20 10 10 20 30 20 20 30];

    mesh(X,Y,z)

    The reason that I believe that it doesnt work is that my z variable is not a funtion of X or Y. But it isn't in real life so how do I get around this?

    Regards

    Tom
     
  2. jcsd
  3. Jul 12, 2006 #2

    Claude Bile

    User Avatar
    Science Advisor

    You need some way for the program to assign an X and Y coordinate to each z value. I guess the easiest way to do this would be to make z a 4x4 matrix. Then you could have something like -

    z = z(x,y)

    Claude.
     
  4. Jul 13, 2006 #3
    You must plot the same sized variables, ie :
    size(X)=size(Y)=size(Z)

    so you must have z in 4x4 form.

    By example, maybe you can (it depends of your problem) just reshape your z :
    >> Z = reshape(z,4,4)

    Z =

    30 20 20 30
    20 10 10 20
    20 10 10 20
    30 20 20 30

    then
    mesh(X,Y,Z)
    and maybe mesh isn't adapted to what you want. Try pcolor instead for a 2D visualisation.
     
  5. Jul 13, 2006 #4

    J77

    User Avatar

    Specifically, you need to specify the value of z at each point (x,y).

    I see you have 16 z values.

    Therefore, you may want a 4x4 grid with the z values in a corresponding 4x4 matrix.

    My little bit: I always use surf(x,y,z) with "shading interp" for best results.
     
  6. Jul 13, 2006 #5
    Thanks guys - I have now got the following code, so near yet so far:

    x = [1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4];
    y = [1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4];

    x = reshape(x,4,4)
    y = reshape(y,4,4)

    z = [30 20 20 30 20 10 10 20 20 10 10 20 30 20 20 30];

    z = reshape(z,4,4)

    z = (z.*x + z.*y);

    surf(x,y,z)
    colormap hsv
    axis([0 4 0 4 0 250])


    to generate the attached plot (see below)

    The plot is not what I want! I want 16 squares the 4 corners to be the same value, the 4 middle ones to be the same value and the rest a third value - as indicated by the z matrix. I am not bothered about the actual values i.e the 4 corners do not have to be 30 I am more interested in the weighting between each of the 3 values.

    Regards

    Tom
     

    Attached Files:

  7. Jul 13, 2006 #6

    Claude Bile

    User Avatar
    Science Advisor

    You are getting a distorted curve because of this line.

    z = (z.*x + z.*y);

    Take out this line and the code should work. Don't get hung up on making z a function of x and y. It wont work because z has no analytic dependance on x and y, thus you need to manually specify the values of z at each coordinate (which you have already done).

    Claude.
     
    Last edited: Jul 13, 2006
  8. Jul 14, 2006 #7
    Thanks Claude,

    I have now chnaged my code to:

    x = [1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4];
    y = [1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4];

    x = reshape(x,4,4)
    y = reshape(y,4,4)

    z = [30 20 20 30 20 10 10 20 20 10 10 20 30 20 20 30];

    z = reshape(z,4,4)

    surf(x,y,z)
    colormap hsv
    axis([0 4 0 4 0 250])


    Although my matrix (coloured part) is still 3 x 3!

    I am trying to achieve something like the following:

    30 20 20 30
    20 10 10 20
    20 10 10 20
    30 20 20 30

    in mesh / surf representation..................

    Regards

    Tom
     
  9. Jul 14, 2006 #8

    J77

    User Avatar

    It's 3x3 squares, but 4x4 coordinate points - as you specify.
     
  10. Jul 14, 2006 #9
    Further .... this is what I want.

    4
    30 20 20 30
    3
    20 10 10 20
    2
    20 10 10 20
    1
    30 20 20 30
    0
    0 1 2 3 4

    where green represent the axis 'ticks' and the purple represent the values between these 'ticks'.

    Regards

    Tom
     
  11. Jul 14, 2006 #10
    J77,

    I NOW realise this - but any suggestions how to change this?

    ... and keep my matrices the same length?

    Tom
     
  12. Jul 14, 2006 #11

    J77

    User Avatar

    Use bar3 ?

    Though you won't get a 'smooth' surface anymore.
     
  13. Jul 14, 2006 #12
    Thats not what I am really looking for!

    Tom
     
  14. Jul 14, 2006 #13

    J77

    User Avatar

    The only other way I see is representing your values at the bisection of two tick marks, ie. at (0.5,0.5)=30, (0.5,1.5)=20, (0.5,2.5)=20, (0.5,3.5)=30 etc.

    You don't have enough data to do anything more...

    (And there aren't enough points to accurately extrapulate away from the data you have)
     
  15. Jul 14, 2006 #14
    J77,

    There is no more data - thats all there is....

    I want a 4x4 mesh i.e. 16 squares, with a z term in each!

    Have would you do as you suggested in an automated way?

    Regards

    Tom
     
  16. Jul 14, 2006 #15

    J77

    User Avatar

    Code (Text):
    z = [30 20 20 30; 20 10 10 20; 20 10 10 20; 30 20 20 30];
    x=[0.5:1:3.5];
    y=[0.5:1:3.5];

    surf(x,y,z)
    axis([0 4 0 4 10 30])

    shading interp
     
     
  17. Jul 14, 2006 #16
    WOW J77,

    That looks amazing!

    Although when I turn the shading interp off I still only see 3x3 and the coloring isn't symmetrical - why is this?

    The pattern is symmetrical when the shading is one!

    Regards

    Tom
     
  18. Jul 14, 2006 #17

    J77

    User Avatar

    Colours in Matlab are quite hard (numerous) to explain... read up on the various colormaps in the helpdesk.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?



Similar Discussions: Create a square array in matlab
  1. Matlab and arrays (Replies: 0)

  2. Arrays in MATLAB (Replies: 3)

Loading...