Create a square array in matlab

  • Context: MATLAB 
  • Thread starter Thread starter tommyers
  • Start date Start date
  • Tags Tags
    Array Matlab Square
Click For Summary

Discussion Overview

The discussion revolves around creating a square array in MATLAB, specifically a 4x4 matrix, and plotting a vector of data (16 elements) over this array. Participants explore various methods to achieve the desired visualization, addressing issues related to the dimensions of the matrices involved and the representation of data points.

Discussion Character

  • Technical explanation, Conceptual clarification, Debate/contested, Mathematical reasoning

Main Points Raised

  • Tom expresses a need to create a 4x4 square array and plot a vector of 16 elements, sharing an initial code that does not work as intended.
  • Claude suggests that z should be a 4x4 matrix to correspond with the dimensions of X and Y.
  • Another participant proposes reshaping the z vector into a 4x4 matrix and mentions that mesh may not be suitable for Tom's needs, recommending pcolor instead.
  • Tom shares an updated code but notes that the resulting plot does not match his expectations, specifically regarding the arrangement of values in the plot.
  • Claude points out that Tom's code is distorting the z values and advises against making z a function of x and y, emphasizing the need to manually specify z values.
  • Tom continues to refine his code but struggles with achieving the desired visual representation of the data.
  • Participants discuss the implications of using different plotting functions, such as surf and bar3, and their effects on the visual output.
  • Tom expresses frustration over the inability to achieve a 4x4 mesh with the desired symmetry and color representation.
  • Another participant suggests representing values at the bisection of tick marks, indicating limitations in the available data.
  • Tom seeks automated solutions to achieve his goal of a 4x4 mesh with distinct z values for each square.
  • J77 provides a working example that meets Tom's criteria, but Tom notes discrepancies in the visual output when changing shading options.
  • Another participant advises reading up on MATLAB's colormaps for better understanding of color representation in plots.

Areas of Agreement / Disagreement

Participants generally agree on the need for z to be a 4x4 matrix to match the dimensions of the x and y matrices. However, there is disagreement on the best approach to achieve the desired visual representation, with multiple suggestions and methods proposed without a clear consensus on the optimal solution.

Contextual Notes

Limitations include the dependence on the specific arrangement of data points and the challenge of visualizing a 4x4 mesh with the desired properties given the constraints of the data provided.

tommyers
Messages
57
Reaction score
0
Hi,

I realize 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 doesn't work but that's 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 doesn't 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
 
Physics news on Phys.org
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.
 
tommyers said:
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 doesn't work but that's 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 doesn't 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?
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.
 
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.
 
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
 

Attachments

  • plot1.jpg
    plot1.jpg
    31.6 KB · Views: 633
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 won't work because z has no analytic dependence 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:
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
 
It's 3x3 squares, but 4x4 coordinate points - as you specify.
 
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
 
  • #10
J77,

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

... and keep my matrices the same length?

Tom
 
  • #11
Use bar3 ?

Though you won't get a 'smooth' surface anymore.
 
  • #12
Thats not what I am really looking for!

Tom
 
  • #13
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)
 
  • #14
J77,

There is no more data - that's 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
 
  • #15
Code:
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
 
  • #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
 
  • #17
Colours in Matlab are quite hard (numerous) to explain... read up on the various colormaps in the helpdesk.
 

Similar threads

  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
3K
Replies
5
Views
3K
  • · Replies 4 ·
Replies
4
Views
6K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 6 ·
Replies
6
Views
2K
  • · Replies 10 ·
Replies
10
Views
3K
  • · Replies 1 ·
Replies
1
Views
3K
  • · Replies 4 ·
Replies
4
Views
3K
  • · Replies 2 ·
Replies
2
Views
4K