What changes should i have to make in my code to remove the error ("Error using contourf Z must be at least a 2x2 matrix.")

2 views (last 30 days)
%------Creating a strain matrix-----------%
E = zeros(2*(size(K1,1)-1),2*(size(K1,1)-1))
for j = 1: (size(K1,1)-1)
for i = 1: (size(K1,1)-1)
v = [zpk1(j,i);zpk2(j,i);zpk1(j,i+1);zpk2(j,i+1);zpk1(j+1,i+1);zpk2(j+1,i+1);zpk1(j+1,i);zpk2(j+1,i)];
e1= strain1(v);
e2= strain2(v);
e3= strain3(v);
e4= strain4(v);
E((2*j-1),(2*i-1)) = e1(1);
E((2*j-1),2*i) = e2(1);
E(2*j,(2*i-1)) = e4(1);
E(2*j,2*i) = e3(1);
end
end
su = round(4*d/g)+1 ;
r = E((((su-1)- round(d/g)):-1:1),(su-1));
p = E((((su-1)- round(d/g)):-1:1),(su));
st = (p+r)./(1.5*(10)^(-4));
m = g*(size(r)-1);
H = 0:g:(m);
h = H./10;
writematrix(st)
type 'st.txt';
writematrix(h)
type 'h.txt';
plot(h,st)
xlim([0 1.5])
xlabel("X2/d",'fontsize',14)
ylabel("Normalised Strain along vertical path", 'fontsize',13)
legend("d/w = 0.5")
saveas(gcf,'plot.png')
contourf(st)
colorbar
saveas(gcf,'contour.png')

Accepted Answer

Garmit Pant
Garmit Pant on 19 Jun 2024
Hello Mohd Babar
From what I understand, you are trying to construct a strain matrix E from given variables (zpk1, zpk2, etc.), and then process this matrix to extract specific data for plotting and analysis.
To resolve the error you are encountering, please ensure that the data you're working with is suitable for a contour plot.
Please refer to the following steps to resolve the issue at hand:
1) Check Data Dimensions:
  • contourffunction needs at least a 2x2 matrix. If st is a vector, it won't work for contourf. Use size(st)function to check its dimensions.
  • The calculation of ‘st’ uses the calculated variables ‘p’ and ‘r’. Given the definition of ‘p’ and ‘r’ is as follows:
r = E((((su-1)- round(d/g)):-1:1),(su-1));
p = E((((su-1)- round(d/g)):-1:1),(su));
  • Using the above definition, given that ‘E’ is a 2-dimensional matrix, the variables ‘p’ and ‘r’ will have 1-D column vectors as their value. Thus ‘st’ which is defined as follows will also represent a 1-D vector:
st = (p+r)./(1.5*(10)^(-4));
2) Ensure Two-Dimensional Data:
  • Contour plots represent variations of a quantity in two-dimensional space. Please ensure that st represents as a two-dimensional field.
  • For one-dimensional data, the line plotplot(st) is more suitable.
3) Debugging Tips:
  • Print the shape of ‘st before attempting to use contourf to confirm it meets the 2x2 minimum requirement.
  • Review the computation steps leading to st to identify where dimensionality might be getting reduced.
If st is inherently one-dimensional, reconsider the use of contourf. For input data that's incorrectly shaped, adjust your data preparation strategy to ensure st is a 2x2 matrix or larger.
I hope you find the above explanation and suggestions useful!

More Answers (1)

Walter Roberson
Walter Roberson on 19 Jun 2024
su = round(4*d/g)+1 ;
Not enough information is given to be sure, but it looks like su is a scalar. If it is not a scalar, then either d or g would have to be non-scalar and the / operation would (probably) fail if g is non-scalar... so su can only be non-scalar if d is non-scalar but g is scalar. Not impossible, but seems unlikely.
r = E((((su-1)- round(d/g)):-1:1),(su-1));
p = E((((su-1)- round(d/g)):-1:1),(su));
We see further evidence that su is likely scalar: it is used inside the colon operator, and the colon operator would ignore all except the first entry if su were a non-scalar.
With su being scalar, you are using a vector of indices for the first dimension and a scalar index for the second dimension, so r and p are both going to be column vectors ( not 2D arrays).
st = (p+r)./(1.5*(10)^(-4));
Column vector plus column vector gives column vector, not 2D array.
contourf(st)
contourf() of a column vector is going to fail because contourf() requires a 2D array.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!