Как я делю элементы матрицы на суммы столбца в MATLAB?

Необходимо использовать внутренний класс только, когда Вы не можете реализовать его как отдельный класс с помощью открытого интерфейса потенциального внешнего класса. Внутренние классы увеличивают размер, сложность и ответственность класса, таким образом, они должны использоваться экономно.

Ваш класс кодера/декодера походит на него лучшие соответствия Стратегическая модель

20
задан gnovice 20 November 2009 в 23:33
поделиться

2 ответа

Вот список различных способов сделать это ...

  • ... используя 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);
42
ответ дан 29 November 2019 в 23:41
поделиться

Не удалось Не сопротивляюсь попыткам понимания списка. Если эта матрица была представлена ​​в списке списков, состоящих из основных строк, попробуйте следующее:

>>> 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).

0
ответ дан 29 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: