I need to program in Matlab do loops - matlab

I have four parameters Q1,Q2,Q3,Q4 and I want to increase the parameters sequentiality 0.05
I mean I want to start the four parameters with the value 0.1, then increase Q1 by 0.05 and keep the others as it 0.1. then keep Q1=0.15, increase the second one Q2 0.05 a

From what I understood, you want to generate all possible tuples from the four parameters, where each can go from 0.1 to some higher value (I am using 0.2) in 0.05 increases. If this is the case, you can use the NDGRID function:
[q1,q2,q3,q4] = ndgrid(0.1:0.05:0.2);
params = [q1(:) q2(:) q3(:) q4(:)]
The result as rows:
params =
0.1 0.1 0.1 0.1
0.15 0.1 0.1 0.1
0.2 0.1 0.1 0.1
0.1 0.15 0.1 0.1
0.15 0.15 0.1 0.1
0.2 0.15 0.1 0.1
0.1 0.2 0.1 0.1
0.15 0.2 0.1 0.1
0.2 0.2 0.1 0.1
0.1 0.1 0.15 0.1
0.15 0.1 0.15 0.1
0.2 0.1 0.15 0.1
0.1 0.15 0.15 0.1
0.15 0.15 0.15 0.1
0.2 0.15 0.15 0.1
0.1 0.2 0.15 0.1
0.15 0.2 0.15 0.1
0.2 0.2 0.15 0.1
0.1 0.1 0.2 0.1
0.15 0.1 0.2 0.1
0.2 0.1 0.2 0.1
0.1 0.15 0.2 0.1
0.15 0.15 0.2 0.1
0.2 0.15 0.2 0.1
0.1 0.2 0.2 0.1
0.15 0.2 0.2 0.1
0.2 0.2 0.2 0.1
0.1 0.1 0.1 0.15
0.15 0.1 0.1 0.15
0.2 0.1 0.1 0.15
0.1 0.15 0.1 0.15
0.15 0.15 0.1 0.15
0.2 0.15 0.1 0.15
0.1 0.2 0.1 0.15
0.15 0.2 0.1 0.15
0.2 0.2 0.1 0.15
0.1 0.1 0.15 0.15
0.15 0.1 0.15 0.15
0.2 0.1 0.15 0.15
0.1 0.15 0.15 0.15
0.15 0.15 0.15 0.15
0.2 0.15 0.15 0.15
0.1 0.2 0.15 0.15
0.15 0.2 0.15 0.15
0.2 0.2 0.15 0.15
0.1 0.1 0.2 0.15
0.15 0.1 0.2 0.15
0.2 0.1 0.2 0.15
0.1 0.15 0.2 0.15
0.15 0.15 0.2 0.15
0.2 0.15 0.2 0.15
0.1 0.2 0.2 0.15
0.15 0.2 0.2 0.15
0.2 0.2 0.2 0.15
0.1 0.1 0.1 0.2
0.15 0.1 0.1 0.2
0.2 0.1 0.1 0.2
0.1 0.15 0.1 0.2
0.15 0.15 0.1 0.2
0.2 0.15 0.1 0.2
0.1 0.2 0.1 0.2
0.15 0.2 0.1 0.2
0.2 0.2 0.1 0.2
0.1 0.1 0.15 0.2
0.15 0.1 0.15 0.2
0.2 0.1 0.15 0.2
0.1 0.15 0.15 0.2
0.15 0.15 0.15 0.2
0.2 0.15 0.15 0.2
0.1 0.2 0.15 0.2
0.15 0.2 0.15 0.2
0.2 0.2 0.15 0.2
0.1 0.1 0.2 0.2
0.15 0.1 0.2 0.2
0.2 0.1 0.2 0.2
0.1 0.15 0.2 0.2
0.15 0.15 0.2 0.2
0.2 0.15 0.2 0.2
0.1 0.2 0.2 0.2
0.15 0.2 0.2 0.2
0.2 0.2 0.2 0.2

If I understand this correctly, you want to increase your four parameters one at a time? How about you use a simple modulus statement, like this:
for (int i = 0; i < 100; i++) {
if (i % 4 == 0) {
Q1 += 0.05;
} else if (i % 4 == 1) {
Q2 += 0.05;
} else if (i % 4 == 2) {
Q3 += 0.05;
} else {
Q4 += 0.05;
}
}
That way, after one loop you will have:
Q1 = 0.15
Q2 = 0.10
Q3 = 0.10
Q4 = 0.10
But after two, you have:
Q1 = 0.15
Q2 = 0.15
Q3 = 0.10
Q4 = 0.10
And so on...

Also, with Matlab without for loop and if statements:
n=4;
step=0.05;
base=floor((2:1/4:n));
q=base*step;
q1=q(4:end);
q2=q(3:end-1);
q3=q(2:end-2);
q4=q(1:end-3);
Which produces:
0.10 0.15 0.15 0.15 0.15 0.20
0.10 0.10 0.15 0.15 0.15 0.15
0.10 0.10 0.10 0.15 0.15 0.15
0.10 0.10 0.10 0.10 0.15 0.15

Related

How to put a border around a tikz figure with tcbox?

The following code produces the figure I want but only when I remove the \tcbox. I'd like a border around the figure. What I have done below works with other tikz figures. The problem seems to be with the table data. Can anyone please advise?
\begin{figure}
\tcbox{
\begin{tikzpicture}
\begin{axis}[
legend pos=south east,
xlabel=Variable 1, % label x axis
ylabel=Variable 2, % label y axis
]
\addplot[
scatter, only marks,
scatter/classes={
a={mark=square*,blue},
b={mark=triangle*,red}
}
]
table[x=x,y=y,meta=label]{
x y label
0.1 0.35 a
0.2 0.4 a
0.25 0.35 a
0.3 0.4 a
0.3 0.35 a
0.4 0.3 a
0.45 0.3 a
0.4 0.4 a
0.6 0.7 b
0.65 0.55 b
0.65 0.55 b
0.7 0.6 b
0.75 0.65 b
0.8 0.75 b
0.9 0.6 b
0.7 0.6 b
0.5 0.7 b
0.5 0.55 b
0.6 0.8 b
};
\legend{}
\end{axis}
\end{tikzpicture}
}
\caption{CAP HERE}
\label{statsexample}
\end{figure}
The issue is with your row separator. You can use row sep=crcr instead:
\begin{figure}
\tcbox{
\begin{tikzpicture}
\begin{axis}[
legend pos=south east,
xlabel=Variable 1, % label x axis
ylabel=Variable 2, % label y axis
]
\addplot[
scatter, only marks,
scatter/classes={
a={mark=square*,blue},
b={mark=triangle*,red}
}
]
table[x=x,y=y,meta=label,row sep=crcr]{
x y label\\
0.1 0.35 a\\
0.2 0.4 a\\
0.25 0.35 a\\
0.3 0.4 a\\
0.3 0.35 a\\
0.4 0.3 a\\
0.45 0.3 a\\
0.4 0.4 a\\
0.6 0.7 b\\
0.65 0.55 b\\
0.65 0.55 b\\
0.7 0.6 b\\
0.75 0.65 b\\
0.8 0.75 b\\
0.9 0.6 b\\
0.7 0.6 b\\
0.5 0.7 b\\
0.5 0.55 b\\
0.6 0.8 b\\
};
\end{axis}
\end{tikzpicture}
}
\caption{CAP HERE}
\label{statsexample}
\end{figure}

Varian in matlab applies multiple functions to input

I've understood the use of varfun in matlab. I need to apply mean and std to the grouped variables of this table.
N mut time
___ ___ ____
250 0.1 0.07
250 0.1 0.05
250 0.1 0.04
250 0.1 0.03
250 0.2 0.03
250 0.2 0.04
250 0.2 0.03
250 0.2 0.05
250 0.3 0.05
250 0.3 0.06
750 0.2 0.24
750 0.3 0.29
750 0.3 0.3
750 0.3 0.31
750 0.3 0.3
750 0.4 0.33
750 0.4 0.34
750 0.4 0.33
750 0.4 0.32
750 0.5 0.38
750 0.5 0.39
This table has two values of N and five different values of mut and I need to compute the average of time grouped by N and mut.
To do this I use the varfun function with the function handle #mean
Tgroup = varfun(#mean,T,'InputVariables','time','GroupingVariables',{'N','mut'})
and I get:
mut N GroupCount mean_time
___ ___ __________ _________
0.1 250 4 0.0475
0.2 250 4 0.0375
0.2 750 1 0.24
0.3 250 2 0.055
0.3 750 4 0.3
0.4 750 4 0.33
0.5 750 2 0.385
but now I also want to add a column that contains the standard deviation. To do this I create a anonymous function
func = #(x)[mean(x), std(x)]
and I use it in varfunc
varfun(#(x)[mean(x),std(x)],([T(1:5:50,:);T(400:5:450,:)]),'InputVariables','time','GroupingVariables',{'mut','N'})
Unfortunately I get this:
ans =
mut N GroupCount Fun_time
___ ___ __________ ___________________
0.1 250 4 0.0475 0.017078
0.2 250 4 0.0375 0.0095743
0.2 750 1 0.24 0
0.3 250 2 0.055 0.0070711
0.3 750 4 0.3 0.008165
0.4 750 4 0.33 0.008165
0.5 750 2 0.385 0.0070711
where the last column 'Fun_time' contains two sub columns, the first being the mean of grouped times, the second the standard deviation of grouped times.
How can I split these two columns directly using an anonymous function? This is very similar to what is done in R with the plyr package.
You could use dplyr to simplify the process
DF = read.table(text="
N mut time
250 0.1 0.07
250 0.1 0.05
250 0.1 0.04
250 0.1 0.03
250 0.2 0.03
250 0.2 0.04
250 0.2 0.03
250 0.2 0.05
250 0.3 0.05
250 0.3 0.06
750 0.2 0.24
750 0.3 0.29
750 0.3 0.3
750 0.3 0.31
750 0.3 0.3
750 0.4 0.33
750 0.4 0.34
750 0.4 0.33
750 0.4 0.32
750 0.5 0.38
750 0.5 0.39",header=TRUE)
newDF = DF %>%
group_by(N,mut) %>%
summarise(count = n(),meanTime = mean(time),sdTime = sd(time) ) %>%
as.data.frame()
# > newDF
# N mut count avgTime avgSD
#1 250 0.1 4 0.0475 0.017078251
#2 250 0.2 4 0.0375 0.009574271
#3 250 0.3 2 0.0550 0.007071068
#4 750 0.2 1 0.2400 NaN
#5 750 0.3 4 0.3000 0.008164966
#6 750 0.4 4 0.3300 0.008164966
#7 750 0.5 2 0.3850 0.007071068

combining for loops in Matlab

I am trying to make a program in matlab to get this numbers:
0 1 0
0 0.8 0.2
0 0.6 0.4
0 0.4 0.6
0 0.2 0.8
0 0 1
0.1 0.9 0
0.1 0.7 0.2
0.1 0.5 0.4
0.1 0.3 0.6
0.1 0.1 0.8
0.1 0 0.9
and so on but I cant make the program to reduce the values of the second and third column when the first column increases. This is my code. Thanks
lai=0:0.1:1;
laj=1:-0.2:0;
lat=0:0.2:1;
for i=1,length(lai)
for j=1,i
for t=1,j
j
lam1(1,:)=lai;
lam2(1,:)=laj;
lam3(1,:)=lat;
end
end
end
Try this and do some thinking for what you require.
for i=0:0.1:0.1
for j=0:0.2:1
disp([i,j,1-j])
end
end

reshape matrix in matlab

I don't see the bug anymore...maybe (very probably :-) ) there's even a much more easier and faster way of doing it...
I summarized the important columns of my huge data frame in a little expData (see below).
The problem is actually quite easy, but I'm just blind for the easy idea of solving it..
My objective is to reshape columns b,c,d into one column that expData afterwards looks like expData2.
I would be really happy, if someone could help me out.
My code so far:
a = [1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5]';
b = [0.3 0.3 0.3 0.3 0.3 0.4 0.4 0.4 0.4 0.4 0.5 0.5 0.5 0.5 0.5 0.8 0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9]';
c = [0.4 0.4 0.4 0.4 0.4 0.6 0.6 0.6 0.6 0.6 0.8 0.8 0.8 0.8 0.8 0.9 0.9 0.9 0.9 0.9 0.1 0.1 0.1 0.1 0.1]';
d = [0.5 0.5 0.5 0.5 0.5 0.1 0.1 0.1 0.1 0.1 0.7 0.7 0.7 0.7 0.7 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3]';
e = rand(25,1);
f = rand(25,1);
a2 = [2 3 4 2 3 4 2 3 4 2 3 4 2 3 4]';
b2 = [0.3 0.4 0.5 0.4 0.6 0.1 0.5 0.8 0.7 0.8 0.9 0.2 0.9 0.1 0.3]';
c2 = rand(15,1);
d2 = rand(15,1);
expData = horzcat(a,b,c,d,e,f);
expData2 = horzcat(a2,b2,c2,d2); % for explanation of my objective
k = horzcat(expData(:,2),expData(:,3),expData(:,4))'; % How I wanted to do it
expData(:,2:4) = [];
k = reshape(k,[],1);
for index = 1:size(expData,1)
if expData(index,1) == 1
expData(index,:) = [];
end
if expData(index,1) == 5
expData(index,:) = [];
end
end
k = k(1:size(expData,1),:);
expData2 = [expData k];
Your current code throws an error, since the number of loop iterations gets determined at the beginning of the loop. As you are removing rows of expData, you run out of rows to index at some point.
The quick fix would be to start looping from the back, i.e. use for index = size(expData,1):-1:1. This way, you can safely remove rows without running into indexing problems.
The elegant fix is to use ismember to identify rows to remove:
rows2remove = ismember(expData(:,1),[1 5]);
expDate(rows2remove,:) = [];

Plotting surface in Octave results in non-uniform surface?

I'm trying to plot the attached data in octave. The 1st column is the X values, the 2nd is the Y value, and the last is the Z values.
I'm running this script:
xVec = reshape(mat(:,1),25,9);
yVec = reshape(mat(:,2),25,9);
zVec = reshape(mat(:,3),25,9);
surf(xVec,yVec,zVec);
axis([0.15 0.85 0.15 0.85]);
set(gca, 'XTick',0.20:0.05:0.80);
set(gca, 'YTick',0.20:0.05:0.80);
But I keep getting an uneven surface which is very hard to understand. Why is that? What am I missing?
The data:
0.15 0.15 40.802
0.15 0.2 40.673
0.15 0.25 40.526
0.15 0.3 40.83
0.15 0.35 40.862
0.15 0.4 40.652
0.15 0.45 40.924
0.15 0.5 40.774
0.15 0.55 41.088
0.15 0.6 40.749
0.15 0.65 41.099
0.15 0.7 41.753
0.15 0.75 41.607
0.15 0.8 41.911
0.15 0.85 41.537
0.2 0.15 39.809
0.2 0.2 39.884
0.2 0.25 40.595
0.2 0.3 40.497
0.2 0.35 40.863
0.2 0.4 41.325
0.2 0.45 40.916
0.2 0.5 40.431
0.2 0.55 40.583
0.2 0.6 40.858
0.2 0.65 40.548
0.2 0.7 41.668
0.2 0.75 41.863
0.2 0.8 41.499
0.2 0.85 41.903
0.25 0.15 39.894
0.25 0.2 39.686
0.25 0.25 40.227
0.25 0.3 40.625
0.25 0.35 40.572
0.25 0.4 41.034
0.25 0.45 40.828
0.25 0.5 40.802
0.25 0.55 40.196
0.25 0.6 40.493
0.25 0.65 41.265
0.25 0.7 40.963
0.25 0.75 41.023
0.25 0.8 41.396
0.25 0.85 41.596
0.3 0.15 39.546
0.3 0.2 40.216
0.3 0.25 39.535
0.3 0.3 39.945
0.3 0.35 40.108
0.3 0.4 40.726
0.3 0.45 40.187
0.3 0.5 41.279
0.3 0.55 40.747
0.3 0.6 41.122
0.3 0.65 40.91
0.3 0.7 40.292
0.3 0.75 41.04
0.3 0.8 41.287
0.3 0.85 42.023
0.35 0.15 38.693
0.35 0.2 40.269
0.35 0.25 40.561
0.35 0.3 40.536
0.35 0.35 40.268
0.35 0.4 39.947
0.35 0.45 40.259
0.35 0.5 40.146
0.35 0.55 41.048
0.35 0.6 40.263
0.35 0.65 40.875
0.35 0.7 41.281
0.35 0.75 40.836
0.35 0.8 41.322
0.35 0.85 41.734
0.4 0.15 39.321
0.4 0.2 39.103
0.4 0.25 39.694
0.4 0.3 40.529
0.4 0.35 40.272
0.4 0.4 39.826
0.4 0.45 40.224
0.4 0.5 40.808
0.4 0.55 40.66
0.4 0.6 40.003
0.4 0.65 41.626
0.4 0.7 41.549
0.4 0.75 41.523
0.4 0.8 41.408
0.4 0.85 41.545
0.45 0.15 39.428
0.45 0.2 39.53
0.45 0.25 39.988
0.45 0.3 40.039
0.45 0.35 40.075
0.45 0.4 40.206
0.45 0.45 40.946
0.45 0.5 41.027
0.45 0.55 41.214
0.45 0.6 40.98
0.45 0.65 40.874
0.45 0.7 41.483
0.45 0.75 41.151
0.45 0.8 41.123
0.45 0.85 40.528
0.5 0.15 39.477
0.5 0.2 39.62
0.5 0.25 40.265
0.5 0.3 39.61
0.5 0.35 40.109
0.5 0.4 40.232
0.5 0.45 40.212
0.5 0.5 40.861
0.5 0.55 39.665
0.5 0.6 41.225
0.5 0.65 40.577
0.5 0.7 40.62
0.5 0.75 41.244
0.5 0.8 40.977
0.5 0.85 41.753
0.55 0.15 39.033
0.55 0.2 39.769
0.55 0.25 40.164
0.55 0.3 40.351
0.55 0.35 40.592
0.55 0.4 40.227
0.55 0.45 40.14
0.55 0.5 40.734
0.55 0.55 40.429
0.55 0.6 40.701
0.55 0.65 40.849
0.55 0.7 40.596
0.55 0.75 41.481
0.55 0.8 41.27
0.55 0.85 40.755
0.6 0.15 38.944
0.6 0.2 39.76
0.6 0.25 39.051
0.6 0.3 40.009
0.6 0.35 39.84
0.6 0.4 40.072
0.6 0.45 41.282
0.6 0.5 40.606
0.6 0.55 40.98
0.6 0.6 41.141
0.6 0.65 40.111
0.6 0.7 41.627
0.6 0.75 41.798
0.6 0.8 41.196
0.6 0.85 41.35
0.65 0.15 39.457
0.65 0.2 39.38
0.65 0.25 40.26
0.65 0.3 40.142
0.65 0.35 39.935
0.65 0.4 40.496
0.65 0.45 39.862
0.65 0.5 40.665
0.65 0.55 40.187
0.65 0.6 40.955
0.65 0.65 39.834
0.65 0.7 40.641
0.65 0.75 41.162
0.65 0.8 41.028
0.65 0.85 41.54
0.7 0.15 38.938
0.7 0.2 39.803
0.7 0.25 39.485
0.7 0.3 39.8
0.7 0.35 39.459
0.7 0.4 39.895
0.7 0.45 40.203
0.7 0.5 40.222
0.7 0.55 40.176
0.7 0.6 41.01
0.7 0.65 41.433
0.7 0.7 41.651
0.7 0.75 41.018
0.7 0.8 41.185
0.7 0.85 41.216
0.75 0.15 39.182
0.75 0.2 38.856
0.75 0.25 39.992
0.75 0.3 40.005
0.75 0.35 39.613
0.75 0.4 39.526
0.75 0.45 40.232
0.75 0.5 40.45
0.75 0.55 41.157
0.75 0.6 40.578
0.75 0.65 41.106
0.75 0.7 41.252
0.75 0.75 40.773
0.75 0.8 41.207
0.75 0.85 42.219
0.8 0.15 39.33
0.8 0.2 39.463
0.8 0.25 39.435
0.8 0.3 40.252
0.8 0.35 39.819
0.8 0.4 39.826
0.8 0.45 40.506
0.8 0.5 41.031
0.8 0.55 40.666
0.8 0.6 41.306
0.8 0.65 40.674
0.8 0.7 41.489
0.8 0.75 40.956
0.8 0.8 41.61
0.8 0.85 41.099
0.85 0.15 39.247
0.85 0.2 38.983
0.85 0.25 39.051
0.85 0.3 39.098
0.85 0.35 39.617
0.85 0.4 40.541
0.85 0.45 40.091
0.85 0.5 40.435
0.85 0.55 40.55
0.85 0.6 40.204
0.85 0.65 40.682
0.85 0.7 40.965
0.85 0.75 41.063
0.85 0.8 41.113
0.85 0.85 41.577
Well, as far as I can see in your data X values change every 15 points, so do Y and Z.
It seems you are reshaping incorrectly.
Try the next really small changes to your code:
xVec = reshape(data(:,1),15,15);
yVec = reshape(data(:,2),15,15);
zVec = reshape(data(:,3),15,15);
surf(xVec,yVec,zVec);
axis([0.15 0.85 0.15 0.85]);
set(gca, 'XTick',0.20:0.05:0.80);
set(gca, 'YTick',0.20:0.05:0.80);
Output:
(This is only true for matlab, so I don't know if octav is any different, but I don't think so.)
The problem is that surf needs a very specific input format, it does not work with vectors.
the function you would want is griddata which interpolates any 3D or 4D input data on an even grid (which would be the needed input of surf).
It works somewhat like this:
xVec=mat(:,1);
yVec=mat(:,2);
zVec=mat(:,3);
gridpoints = 100;
[xi, yi] = meshgrid(linspace(min(xVec),max(xVec),gridpoints),linspace(min(xVec),max(xVec),gridpoints));
zi = griddata(xVec,yVec,zVec,xi,yi);
surf(xi,yi,zi);