MATLAB Answers

Full Factorial Design of Experiments

3 views (last 30 days)
Maximilian Bayerl
Maximilian Bayerl on 30 Apr 2021
Commented: dpb on 14 May 2021
Hello together,
i am about to write a code that should produce me a txt file with a full factorial combination of the input of vectors. The vectors could have a different length. I know about the matlab function fullfact([,]) but since I will use decimal numbers i needed a differen solution.
I tested the code and it seems to work. But do I make a mistake, that I may have not seen yet? The vectors that i defined in this skript are just for example. Later on I will use a input and the vectors will result in much bigger ones.
clc
clear
pyrz = [1, 2];
pyrx = [1, 2, 3];
pyra = [1, 2];
%I need to know the final count of columns in the resulting matrix
Avert=length(pyrz)*length(pyrx)*length(pyra);
if sum (pyrx) == 0
pyrx = zeros(1, Avert);
elseif sum (pyrx) ~= 0
count = Avert/length(pyrx);
pyrx = repmat(pyrx,1,count);
end
count = Avert/length(pyrz);
pyrz = repmat(pyrz,1,count);
pyrz = sort(pyrz);
count = Avert/length(pyra);
pyra = repmat(pyra,1,count);
pyra = sort(pyra,'descend');

Accepted Answer

dpb
dpb on 30 Apr 2021
Edited: dpb on 30 Apr 2021
"I know about the matlab function fullfact([,]) but since I will use decimal numbers i needed a differen solution."
There's no reason still to not use fullfact; the levels [1:Nl] are simply placeholders for the actual levels for each factor, not the experimental levels themselves.
If you want to write an array/file that contains the actual levels themselves, just use a lookup table of the level into the values you define for each level. Nothing more is needed.
Small example for brevity; principle holds in general no matter the number of factors and levels...
>> ff=fullfact([3,2]) % design matrix for 3x2 full factorial
ff =
1 1
2 1
3 1
1 2
2 2
3 2
>>
>> LVLS=[4.3*[-1:1];[pi*[-1 1] nan]].' % array of Levels by column
LVLS =
-4.3000 -3.1416
0 3.1416
4.3000 NaN
>>
Now build the array of experiment levels
>>FF=cell2mat(arrayfun(@(r)[LVLS(ff(r,1),1) LVLS(ff(r,2),2)],1:size(ff,1),'UniformOutput',false).')
FF =
-4.3000 -3.1416
0 -3.1416
4.3000 -3.1416
-4.3000 3.1416
0 3.1416
4.3000 3.1416
>>
You could, of course, keep separate vector arrays for each factor or a cell array, I used an array with a NaN element for the missing levels to avoid the cell array route as it will never be referenced so it's just a placeholder to make a rectangular array.
  3 Comments
dpb
dpb on 14 May 2021
What kind of restrictions?

Sign in to comment.

More Answers (0)

Products


Release

R2020b

Community Treasure Hunt

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

Start Hunting!