New code with speficied target row and col sum, using FEX randfixesum and requires optimization toolbox EDIT: new code no longer requires FEX
rs = [100; 200; 300]
cs = [500, 100]
if abs(sum(rs)-sum(cs)) > 1e-10*abs(sum(rs))
error('sum(rs) must be equal to sum(cs)');
end
m = length(rs);
n = length(cs);
I = zeros(m,n);
I(:) = 1:m*n;
Aeq = accumarray([repmat((1:m)',n,1) I(:); repelem(m+(1:n)',m,1) I(:)],1);
beq = [rs(:); cs(:)];
lb = zeros(m*n,1);
ub = inf(m*n,1);
B = zeros(m*n);
for k=1:m*n
f = accumarray(k, 1, [m*n 1]);
B(:,k) = linprog(f, [], [], Aeq, beq, lb, ub);
end
x=-log(rand(m*n,1)); x=x./sum(x);
A = reshape(B*x,[m n])
sum(A,2)
sum(A,1)
Best Answer