Подтвердить что ты не робот

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

Есть ли простой способ разделить каждый элемент матрицы на сумму столбца? Например:

input:

1  4

4  10

output:

1/5  4/14

4/5  10/14
4b9b3361

Ответ 1

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

  • ... используя bsxfun:

    B = bsxfun(@rdivide,A,sum(A));
    
  • ... используя repmat:

    B = A./repmat(sum(A),size(A,1),1);
    
  • ... используя внешний продукт (как предложено Amro):

    B = A./(ones(size(A,1),1)*sum(A));
    
  • ... и используя цикл for (как предложено mtrw):

    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]]

Заметим, что zip (* A) дает транспонирование (A).