How to compute var on each matrix of a cell array?

6 ビュー (過去 30 日間)
Ahmed
Ahmed 2024 年 2 月 7 日
コメント済み: Stephen23 2024 年 2 月 7 日
I have G = 1 * 227 cell and of each element has size 116 3. I and to compute variance of G e.g.,it should compute each matrix of G. I tried this way but not working
abc = var(G{K}) (if K = 1:227)
it gives e.g., abc = [a b c] onlyy three values.
How I can do it get

回答 (1 件)

Avni Agrawal
Avni Agrawal 2024 年 2 月 7 日
Hi Nisar,
I understand that you are trying to compute the variance of each matrix within a cell array `G`, where `G` is a 1x227 cell array and each element of `G` is a 116x3 matrix.
The MATLAB function `var` computes the variance along each column of a matrix by default. If you apply `var` to each cell in the cell array using the syntax `var(G{K})`, it will give you a 1x3 vector for each matrix in the cell array, where each element of the vector is the variance of the corresponding column in the matrix. To compute the variance for each matrix in the cell array and store the results in a new array, you can use a loop or a cell function like `cellfun`. Here is how you can do it with a loop:
% Assuming G is a 1x227 cell array, with each cell containing a 116x3 matrix
variances = zeros(227, 3); % Preallocate a matrix to store the variances
for K = 1:227
variances(K, :) = var(G{K}); % Compute variance for each matrix and store it
end
If you want to compute the overall variance for each entire matrix (not column-wise), you would need to reshape each matrix into a vector and then compute the variance. Here is how you can do that:
% Assuming G is a 1x227 cell array, with each cell containing a 116x3 matrix
overall_variances = zeros(227, 1); % Preallocate a vector to store the overall variances
for K = 1:227
matrix_as_vector = G{K}(:); % Reshape the matrix into a vector
overall_variances(K) = var(matrix_as_vector); % Compute overall variance and store it
end
If you want to use `cellfun` to avoid explicit looping, it would look like this:
% For column-wise variance
variances = cellfun(@(x) var(x), G, 'UniformOutput', false);
variances = cell2mat(variances); % Convert cell array to a regular matrix
% For overall variance
overall_variances = cellfun(@(x) var(x(:)), G);
In the `cellfun` examples, `variances` will be a 227x3 matrix with the column-wise variances, and `overall_variances` will be a 227x1 vector with the overall variances of each matrix in the cell array `G`.
I hope this helps.
  4 件のコメント
Ahmed
Ahmed 2024 年 2 月 7 日
編集済み: Ahmed 2024 年 2 月 7 日
@Stephen23 Thanks, it is working and then is this one correct?
N = 15
for K=1:227
C = cellfun(@var, G, 'UniformOutput', false);
VN = C{:,:}./N; % Is this correct divide all C with N like this? How I can divide a cell by N
stdN = sqrt(C./N);
ND = data{K,1} + stdN.*randn(size(data{K,1})); % the size of data{K,1} 116 227
end
Stephen23
Stephen23 2024 年 2 月 7 日
" it is working and then is this one correct?"
You are mixing up CELLFUN and a FOR-loop. You do not need both. Pick which one you want to use.
"Is this correct divide all C with N like this?"
No, it looks like you are tying to treat a cell array like a table. Cell arrays are not tables.
Both Avni Agrawal and I showed you how to use CELL2MAT. You should use CELL2MAT or a comma-separated list and e.g. VERTCAT:
vertcat(C{:})
"How I can divide a cell by N"
Cell arrays cannot be divided by anything.

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

カテゴリ

Help Center および File ExchangeCharacters and Strings についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by