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.
     
Share this great discussion with others via Reddit, Google+, Twitter, or Facebook




Loading...
Similar Threads for Create square array Date
MATLAB How to create distinct circles in Matlab? May 11, 2017
Create track map using Lateral acceleration & speed in Matlab Mar 11, 2016
How to create a matrix with variables? Jan 28, 2016