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

9 ビュー (過去 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 ExchangeCreating and Concatenating Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by