To begin with, I think a closed solution using SVDs probably not is possible, because this problem looks lot like the type of problems people are trying to solve heuristically using nuclear norm regularizations etc.
18x3, so pretty large then. No simple way to solve it. You could try the global solver to see if it spits out anything reasonably fast, although I doubt it will. You could also try a nuclear norm approach to see if your data is nice enough to allow such a simple approach
m = 18;
n = 3;
A = randn(m,4);
B = randn(n,4);
X = sdpvar(m,1);
Y = sdpvar(1,n);
Z = sdpvar(m,n);
Q = A + Z*B;
objective = trace(Q'*Q);
% Global solver
solvesdp([Z == X*Y, -100 <= [X(:);Y(:)] <= 100], objective,sdpsettings('solver','bmibnb'))
% nuclear norm approach
solvesdp([],objective + norm(Z,'nuclear'))