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 commentaires

Rik
Rik le 3 Avr 2019
How are you getting rid of the zeros? Arrays in Matlab must be rectangular. You can use a cell array with empty cells in them, or signaling values like NaN.
Adam
Adam le 3 Avr 2019
The NaN approach is definitely the best choice in most cases as working with numeric arrays is vastly simpler and quicker than working with cell arrays.
Adam Danz
Adam Danz le 3 Avr 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 le 3 Avr 2019
Adam Danz, that is exactly my issue. I am sorry for my late response, but that is the issue I am dealing with.

Connectez-vous pour commenter.

 Réponse acceptée

Jan
Jan le 3 Avr 2019
Modifié(e) : Jan le 4 Avr 2019

2 votes

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 commentaire

madhan ravi
madhan ravi le 3 Avr 2019
+1, cell is the best and uncertainty friend of a programmer.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

Community Treasure Hunt

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

Start Hunting!

Translated by