Vectors Must be the Same Length

Rafael

Rafael (view profile)

さんによって質問されました 2017 年 12 月 10 日

Rafael (view profile)

さんによって コメントされました 2017 年 12 月 12 日
Michal Dobai

Michal Dobai (view profile)

さんの 回答が採用されました
I want to plot this but the problem is that I need to somehow have the vectors be the same length.
Year=input('Enter the year ');
Hour=input('Enter the hour ');
Index=find(time(:,1)==Year & time(:,16)==Hour);
Max=max(time(Index,2:13))
Mean=mean(mean(time(Index,2:13)));
X=(1:365)';
Y=Max';
y=Mean*ones(1,365);
cla
hold on
plot(X,y,'b') %This plots the mean value with x.
plot(X,Y)
The objective is to plot max and mean when x goes from 1 to 365. Mean has to be a single line because it's a single value. Max has to be 12x365 and it should return only one value for each column but the problem is that when I run that code it gives me the error.
Day=input('Enter the year ');
Year=input('Enter the hour ');
Index=find(time(:,1)==Year & time(:,16)==Hour);
Max=max(time(Index,2:13),1)
Mean=mean(mean(time(Index,2:13)));
X=(1:365)';
Y=Max';
y=Mean*ones(1,365);
cla
hold on
plot(X,y,'b') %This plots the mean value with x.
plot(X,Y)
If I run the above code it works fine. It doesn't return any error. Now the problem with the second one is that it returns more than one value for each column and the plot shows different colors in the graph. I want it to show only one color and hopefully run the code which returns one value for each column for max.

Rafael

Rafael (view profile)

on 11 Dec 2017
When I use the [] is when I get the error,
Error using plot
Vectors must be the same length.
Walter Roberson

Walter Roberson (view profile)

on 11 Dec 2017
When you use
Max=max(time(Index,2:13),[],1)
you will get one result for each entry in Index. Then
X=(1:365)';
Y=Max';
plot(X, Y)
assumes that Y is 365 entries, which assumes that your Index happened to match exactly 365 locations every time. That seems unlikely to be the case as your Index is found by selecting on Day and Hour, so it seems unlikely that you would just happen to have 365 years to match the Day and Hour to.
If you have one year of data taken once per hour, it would make more sense for Index to be based upon Hour alone, giving you one result per day.
Question: what are you doing about leap year?
Question: Are the times local timezone or UTC? Because if they are local then you have to worry about any daylight savings time in effect.
Rafael

Rafael (view profile)

on 11 Dec 2017
Sorry, Days is supposed to be Years. I fixed it.
I have to plot X that is 1:365 (which is days) vs Y has to be the Max from maximum value of each day for the inputted year. That is supposed to give me something like this, サインイン to comment.

2 件の回答

Answer by Michal Dobai

Michal Dobai (view profile)

on 12 Dec 2017
Edited by Michal Dobai

Michal Dobai (view profile)

on 12 Dec 2017

It's a lot more clear to me now. Or at least I hope so :) (reference to your comment )
Let's say that you have these input data:
%Year < < < this is your data > > > hour (day)
%-----------------------------------------------------------------------
time = ...
[2016 76 78 87 33 33 81 58 49 0 11 81 54 5 82 6; % 1
2016 54 98 26 8 94 42 96 72 37 91 70 57 42 37 7; % 1
2016 59 22 10 98 95 49 92 39 64 1 54 5 25 74 6; % 2
2016 95 20 79 12 33 67 21 14 23 58 71 61 19 16 7; % 2
2016 84 19 57 45 89 25 6 59 1 81 30 66 60 74 6; % 3
2016 49 4 50 36 22 30 91 46 69 2 78 26 26 83 7; % 3
2016 36 8 60 62 91 38 30 54 56 56 99 87 80 2 6; % 4
2016 78 75 51 34 37 50 68 16 99 95 87 99 64 43 7; % 4
2017 68 56 46 53 80 10 2 93 61 81 79 41 40 25 6; % 1
2017 70 21 34 22 17 8 62 64 0 56 85 16 25 84 7; % 1
2017 12 86 63 95 11 9 8 53 99 15 51 84 71 90 6; % 2
2017 28 18 36 14 76 86 54 44 40 7 90 79 26 41 7; % 2
2017 97 12 63 57 89 37 28 14 89 21 45 69 34 20 6; % 3
2017 86 82 8 57 91 28 64 18 6 33 61 58 47 45 7; % 3
2017 79 11 99 30 56 96 8 37 14 28 25 74 7 34 6; % 4
2017 19 97 70 93 64 29 85 34 78 97 16 92 72 87 7]; % 4
In this example I will assume that year has only four days and that you have somehow collected data for hours 6 and 7 for each day.
Now, when you input 2017 as year and 6 as hour, this
Index=find(time(:,1)==Year & time(:,16)==Hour);
will select exactly four rows from time matrix. (well, at least in my case, because I 'collected' values for every single day of the year 2017 at 6'o clock).
So now we can create selection of size 4x12 (in your case 365x12) like you already did: time(Index,2:13) Maximum of each day (each row of this selection) can be calculated like this:
Max = max(time(Index,2:13),[],2);
Why 2? From Documentation for function max:
M = max(A,[],dim) returns the largest elements along dimension dim. For example, if A is a matrix, then max(A,[],2) is a column vector containing the maximum value of each row.
Now max will be the column vector of size 4 (one value for each day of the year). X is also column vector of size 4, so we can plot it without any problem. (and without error Vectors Must be the Same Length)
Here is the whole code:
Year=input('Enter the year ');
Hour=input('Enter the hour ');
Index=find(time(:,1)==Year & time(:,16)==Hour);
Max = max(time(Index,2:13),[],2);
Mean = mean(mean(time(Index,2:13)));
X=(1:4)'; % In this example - year has only 4 days
Y=Max';
y=Mean*ones(1,4); % In this example - year has only 4 days
cla
hold on
plot(X,y,'b') %This plots the mean value with x.
plot(X,Y)
ylim([0,100]);
And here is the plot this code produce for input values Year=2017 and Hour=6: Now, as Walter Roberson already mentioned in his comment , there can be cases when your code doesn't select exactly 365 rows. You should consider these cases and handle them properly.

Rafael

Rafael (view profile)

on 12 Dec 2017
I fixed it. I had an extra line, uistack which I didn't saw and once I removed it it return both graphs like I wanted.
Michal Dobai

Michal Dobai (view profile)

on 12 Dec 2017
I'm glad you managed to solve your problem :)
Rafael

Rafael (view profile)

on 12 Dec 2017
Hey, thank you! You are a master!

サインイン to comment.

Answer by Jos (10584)

Jos (10584) (view profile)

on 11 Dec 2017

Is this what you want?
X = 1:50 ;
Y = rand(size(X)) ;
Ymean = mean(Y(:)) ; % get single value; prefered over mean(mean(..))
plot(X, Y, 'ro') ;
hold on ;
plot(X([1 end]), Ymean([1 1]), 'b-') ;
There are also utilities on the File Exchange to plot horizontal and vertical lines at a specific value, like my own GRIDXY function, available here: https://uk.mathworks.com/matlabcentral/fileexchange/9973-gridxy--v2-2-feb-2008-
plot(X, Y, 'ro')
gridxy([], mean(Y(:)))

Rafael

Rafael (view profile)

on 11 Dec 2017
There has to be two plot.
• X has to go from 1:365
• Y is the Max
• The other "y" is Mean and that plot is working. The one not working is with the Max.
Rafael

Rafael (view profile)

on 12 Dec 2017
Yup, I remember now. The mean has to look like Max. I can't be a straight line. I have to set Mean like this,
Mean=mean(data_2(Index,2:13))
y=Mean.*ones(1,365);
The problem is that it returns Matrix dimensions must agree.

サインイン to comment.