How to normalize all the matrices in a loop so that each row sums up to 1

35 ビュー (過去 30 日間)
parag gupta
parag gupta 2019 年 3 月 20 日
編集済み: Moritz Hesse 2019 年 3 月 20 日
N = 4
n = 2
A = cell(1,N);
for i = 1:N
A{i} = rand(n,n)
end
celldisp(A)
From above command I will get 4 matrices.How to normalize all the matrices( ie all 4 matrices) so that each row sums up to 1.
Thanks

採用された回答

harsha001
harsha001 2019 年 3 月 20 日
編集済み: harsha001 2019 年 3 月 20 日
There are two parts to your question - (a) how to normalise each row of a matrix at once, and (b) how to do it independently for each matrix in a cell array.
(a)
use the dot notation to divide each row by the sum of that row
So for a matrix M,
M = M./sum(M,2); % sum acros the 2nd dimension (column) and do a row-wise division
will normalise each row to sum to 1.
If instead you want to normalise each column, simply:
M = M./sum(M,1);
(b) You can either use a for loop to do the same for each matrix A{jj} of the cell array
for jj=1:N
A{jj} = A{jj}./sum(A{jj},2);
end
OR use a neat arrayfun to do the same:
A = arrayfun( @(jj) A{jj}./sum(A{jj},2), 1:N , 'UniformOutput', false );
where i use the array fun to loop over 1 to N, setting uniform output to false so my result is also a cell-array. Imagine it like:
output = arrayfun( @jj, func(something), loop over 1 to N, 'UniformOutput', false)
  2 件のコメント
parag gupta
parag gupta 2019 年 3 月 20 日
thanks ! :)
madhan ravi
madhan ravi 2019 年 3 月 20 日
@Harsha: How did you know there is two parts to the question?

サインインしてコメントする。

その他の回答 (2 件)

Steven Lord
Steven Lord 2019 年 3 月 20 日
The sum of the absolute values of the elements of a vector is the 1-norm. You can use the normalize function introduced in release R2018a to normalize each row of a matrix by the 1-norm.
A = rand(6);
B = normalize(A, 2, 'norm', 1);
shouldBeCloseTo1 = sum(B, 2)
You can use a for loop or arrayfun to apply normalize to each matrix in the cell array.

Moritz Hesse
Moritz Hesse 2019 年 3 月 20 日
編集済み: Moritz Hesse 2019 年 3 月 20 日
If you have the deep learning toolbox installed, you can use normr to normalise matrix rows. You can access cell contents with curly brace notation
N = 4
n = 2
A = cell(1,N);
for i = 1:N
A{i} = rand(n,n)
end
celldisp(A)
% Loop through cells and normalise matrix rows
for i = 1:N
A{i} = normr(A{i})
end
  2 件のコメント
parag gupta
parag gupta 2019 年 3 月 20 日
'normr' requires Deep Learning Toolbox.
Error in Untitledhhho (line 15)
A{i} = normr(A{i})
got this error
parag gupta
parag gupta 2019 年 3 月 20 日
thanks ! :)

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrices and Arrays についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by