Необходимо использовать внутренний класс только, когда Вы не можете реализовать его как отдельный класс с помощью открытого интерфейса потенциального внешнего класса. Внутренние классы увеличивают размер, сложность и ответственность класса, таким образом, они должны использоваться экономно.
Ваш класс кодера/декодера походит на него лучшие соответствия Стратегическая модель
Вот список различных способов сделать это ...
... используя bsxfun
:
B = bsxfun (@ rdivide, A, сумма (А));
... используя repmat
:
B = A./repmat(sum(A),size(A,1),1);
... с использованием внешнего продукта (как было предложено Амро ):
B = A./(ones(size(A,1),1)* сумма (А));
... и используя цикл for (как предлагает mtrw ):
B = A;
columnSums = сумма (B);
для i = 1: numel (columnSums)
B (:, i) = B (:, i) ./ columnSums (i);
конец
Обновление:
Начиная с MATLAB R2016b и более поздних версий, большинство встроенных двоичных функций (список можно найти здесь ) поддерживают неявное расширение, то есть они имеют поведение bsxfun
]по умолчанию. Итак, в новейших версиях MATLAB все, что вам нужно сделать, это:
B = A./sum(A);
Не удалось Не сопротивляюсь попыткам понимания списка. Если эта матрица была представлена в списке списков, состоящих из основных строк, попробуйте следующее:
>>> 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]]
Обратите внимание, что zip (* A) дает транспонирование (A).