How to exclude zeros in a matrix?

17 views (last 30 days)
Robert  Flores
Robert Flores on 3 Apr 2019
Edited: Jan on 4 Apr 2019
Hello,
I am trying to get rid of the zero values in a matrix I have in V(:,:,i) in my for loop. However, I am getting an error, "Unable to perform assignment because the size of the left side is 297-by-448 and the size of the right side is 10611-by-1. Error in DIC_Data_Extraction (line 17) V(:,:,i) = nonzeros(data_dic_save.displacements(i).plot_v_ref_formatted);". Therfore, if you are able to help me out in resolving this error, it will be most appreciated, thanks. Below is a copy of my code. Also, unfortunatley, I can not attach my work space, so I hope this is enough information for you to help me out, thanks.
-Robert
% The displacements in the Y-direction
V = zeros(297,448);
% Vyy = zeros{20863,1};
for i = 1:8
V(:,:,i) = nonzeros(data_dic_save.displacements(i).plot_v_ref_formatted);
% Vyy{i} = {nonzeros(V(:,:,i))}
avg(i) = abs(mean(mean(V(:,:,i))));
med(i) = median(median(V(:,:,i)));
end
  4 Comments
Adam Danz
Adam Danz on 3 Apr 2019
From your description, it seems like zeros aren't the problem. Your nonzeros() function is producing a columnar vector with 10611 elements and you're trying to store that in a 297x448 matrix.
Robert  Flores
Robert Flores on 3 Apr 2019
Adam Danz, that is exactly my issue. I am sorry for my late response, but that is the issue I am dealing with.

Sign in to comment.

Accepted Answer

Jan
Jan on 3 Apr 2019
Edited: Jan on 4 Apr 2019
The cell is the right approach:
for i = 1:8
Vyy{i} = nonzeros(data_dic_save.displacements(i).plot_v_ref_formatted);
avg(i) = abs(mean(Vyy{i}));
med(i) = median(Vyy{i});
end
Other have explained already, that arrays must be rectangular.
Another option would be to set the zeros to NaN:
V = zeros(297, 448, 8); % Pre-allocate all 3 dimensions!
for i = 1:8
aV = data_dic_save.displacements(i).plot_v_ref_formatted;
aV(aV == 0) = NaN;
V(:, :, i) = aV;
avg(i) = abs(mean(aV, 'all', 'omitnan'));
med(i) = median(aV, 'all', 'omitnan'); % See comments
end
Attention: I guessed, that you want the median of all values. Then median(X, 'all') is equivalent to median(X(:)), which is not necessarily the same as median(median(X, 1), 2). With nonzeros the output is a vector and there is no difference. Please check this explicitly.
  1 Comment
madhan ravi
madhan ravi on 3 Apr 2019
+1, cell is the best and uncertainty friend of a programmer.

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!