B = A;
columnSums = sum(B);
for i = 1:numel(columnSums)
B(:,i) = B(:,i)./columnSums(i);
end
Update:
В MATLAB R2016b и более поздних версиях большинство встроенных двоичных функций (список можно найти здесь) поддерживают неявное расширение, то есть они имеют поведение bsxfun по умолчанию. Итак, в новейших версиях MATLAB вам нужно всего лишь:
B = A./sum(A);
Ответ 2
a=[1 4;4 10]
a =
1 4
4 10
a*diag(1./sum(a,1))
ans =
0.2000 0.2857
0.8000 0.7143
Ответ 3
Не удалось устоять перед попыткой понимания списка. Если эта матрица была представлена в списке основных списков, попробуйте следующее:
>>> A = [[1,4],[4,10]]
>>> [[float(i)/j for i,j in zip(a,map(sum,zip(*A)))] for a in A]
[[0.20000000000000001, 0.2857142857142857], [0.80000000000000004, 0.7142857142857143]]
Да, я знаю, что это не суперэффективно, так как мы вычисляем суммы столбцов один раз в строке. Сохранение этого в переменной colsums выглядит так:
>>> colsums = map(sum,zip(*A))
>>> [[float(i)/j for i,j in zip(a,colsums)] for a in A]
[[0.20000000000000001, 0.2857142857142857], [0.80000000000000004, 0.7142857142857143]]