# MATLAB plotting problems...

19 Ansichten (letzte 30 Tage)
David Oshidero am 5 Okt. 2017
Bearbeitet: Jan am 5 Nov. 2017
I have been trying to plot this graph on matlab or figure out how to go about doing it but everything I seem to do so far does not work. I was hoping I could get some help.
%%Define Variables
g = 9.8;
c = 14;
v=35;
%%Calculations
figure; hold on
for m = 60:70
y(m) = (14*35)/(m*9.8);
end
figure(1); plot(m,y(m));
xlim([60 70]);
##### 1 KommentarKeine anzeigenKeine ausblenden
Stephen23 am 3 Nov. 2017
See Jan Simon's answer for the simplest solution.

Melden Sie sich an, um zu kommentieren.

### Akzeptierte Antwort

John BG am 5 Okt. 2017
Bearbeitet: John BG am 5 Okt. 2017
Hi David
your code doesn't plot because m is scalar while y is a vector.
command plot requires either a vector, in this case would be y, or 2 vectors.
If you pass a scalar and a vector plot basically does nothing.
try either
plot([60:70],y)
or simply
plot(y)
John BG
##### 7 Kommentare6 ältere Kommentare anzeigen6 ältere Kommentare ausblenden
John BG am 7 Okt. 2017
the reason why this question was posted is that the plot was invoked with a scalar in the reference vector while passing the vector y in the function field of the plot.
My answer is not confusing, it addresses the attempt to use a scalar as reference to multiple values in y.
The code posted in the question didn't plot, but with the correct reference vector input in plot, now it plots ok, what's so confusing?

Melden Sie sich an, um zu kommentieren.

### Weitere Antworten (2)

Walter Roberson am 5 Okt. 2017
After the for loop m will be the scalar 70, not the range.
##### 6 Kommentare5 ältere Kommentare anzeigen5 ältere Kommentare ausblenden
Jan am 6 Okt. 2017
Bearbeitet: Jan am 5 Nov. 2017
@David: It is a pre-allocation. The output array is created at once, because this is much cheaper than letting the array grow iteratively. Example:
x = [];
for k = 1:1e7
x(k) = k + rand;
end
Now in each iteration Matlab has to create a new array in the memory, which is 1 element larger than the old one, copy the former contents and insert the new value. Finally Matlab did not reserve memory for 1e6 elements, but for sum(1:1e7). For a double this needs 8 byte per element, such that 400 TB must be allocated and copied. This wastes a lot of time. To avoid this, the array is allocated before the loop:
x = zeros(1, 1e7);
for k = 1:1e7
x(k) = k + rand;
end
While the first version takes 1.75 sec, the second needs 0.45 sec only.
Well, this is the theory. Fortunately Matlab tries to reduce the drawbacks as good as possible. Even a fast processor could allocate and copy 400 TB in 1.75 seconds.
In your case the runtime does not matter. But the strategy in the forum is to teach good programming styles in general.

Melden Sie sich an, um zu kommentieren.

Jan am 6 Okt. 2017
Bearbeitet: Jan am 9 Okt. 2017
A simplified version of your code:
g = 9.8;
c = 14;
v = 35;
t = 60:70;
y = (14*35) ./ (m * 9.8); % [EDITED, fixed typo, thanks Walter!]
figure;
plot(m, y);
xlim([60 70]);
This is called "vectorizing": Matlab can perform the calculations with the vector m directly. This can be faster and nicer than the loop version, and it is less prone to bugs of indexing.
##### 2 Kommentare1 älteren Kommentar anzeigen1 älteren Kommentar ausblenden
Jan am 9 Okt. 2017
Thank you, Walter.

Melden Sie sich an, um zu kommentieren.

### Kategorien

Mehr zu Annotations finden Sie in Help Center und File Exchange

### Community Treasure Hunt

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

Start Hunting!

Translated by