Mínimo y máximo de desviaciones de la media en Matlab.
Introducción: Necesito encontrar las desviaciones mayores/menores posibles del promedio en algunos vectores de Matlab dados. El problema es que, debido a las grandes dimensiones de las matrices involucradas, no puedo construir explícitamente dichos vectores. Por lo tanto, me pregunto si hay una forma más inteligente de proceder. En resumen, describo a continuación el procedimiento que implementaría si no hubiera restricciones de memoria y luego presento mi pregunta.
(1) Considere 28 matrices en Matlab A{1},…, A{28}.
Para cada j=1,…,28, A{j} tiene 4 columnas. El número de filas de A{j} puede ser diferente en j=1,…, 28 y se almacena en el vector r.
clear
rng default
A=cell(28,1);
r=randi(10000,28,1)+10000; %28×1
for j=1:28
A{j}=randn(r(j),4); %r(j)x4
end
(2) Para cada j=1,…,28, sea b{j} el vector r(j) x 1 que se obtiene sumando las dos primeras filas de A{j} y restando las dos últimas filas de A{j}:
b=cell(28,1);
for j=1:28
b{j}=A{j}(:,1)+A{j}(:,2)-A{j}(:,3)-A{j}(:,4); %r(j)x1
end
(3) Sea B la matriz R x 28 que se obtiene como una cuadrícula de 28 dimensiones a partir de los vectores b{1},…,b{28}:
%[ca, cb, cc, cd, ce, …] = ndgrid(b{1}, b{2}, b{3} , …, b{28});
%B(:,1)=ca(:);
%B(:,2)=cb(:);
%…
%B(:,28)=…;
c=cell(28,1);
[c{:}]=ndgrid(b{:});
c=cellfun(@(x)x(:),c,’UniformOutput’,false);
B=[c{:}];
Disculpas por el código incompleto. Como te podrás imaginar, este es el paso en el que tengo problemas como se explica a continuación.
(4) Para cada fila de B, calculo la diferencia entre dicha fila y su valor promedio y guardo los resultados en una matriz D de dimensiones R x 28:
%R=size(B,1);
%D=zeros(R,28);
%for t=1:R
% D(t,:)=B(t,:)-mean(B(t,:));
%end
D=B-mean(B,2);
(5) Para cada j=1,…,28, calculo el valor mínimo y máximo de D(:,j) y lo guardo en una matriz F
F=zeros(2,28);
for j=1:28
F(1,j)=min(D(:,j));
F(2,j)=max(D(:,j));
end
Pregunta: F es la matriz que me gustaría construir. Sin embargo, el paso (3) no es factible debido a los grandes r(1),…, r(28). Incluso un bucle tomaría mucho tiempo. Por lo tanto, me pregunto: ¿hay alguna forma más inteligente de construir F que me evite obtener explícitamente B?
davy.ai
Como experto en IT especializado en Matlab, hay varias formas posibles de abordar este problema sin construir explícitamente la matriz
B
. Una solución posible es utilizar el hecho de que el valor medio deb{j}
en todas las matrices es el mismo para todos losj = 1, ..., 28
. Por lo tanto, podemos calcular el valor mediomu
de cadab{j}
por separado y utilizarlo para calcular directamente la desviación máxima y mínima de cadab{j}
respecto al valor medio en todas las matrices.Aquí tienes una versión actualizada del código que implementa este enfoque:
En esta versión del código, calculamos directamente el valor medio
mu
de cadab{j}
utilizando la funciónmean
. Luego, calculamos la desviación máxima y mínima de cadab{j}
respecto a su valor medio tomando la diferencia absoluta entre los dos y encontrando los valores máximos y mínimos.Este enfoque evita la necesidad de construir explícitamente la matriz
B
, lo cual puede ser computacionalmente costoso para valores grandes der(1), ..., r(28)
. En su lugar, calculamos las cantidades relevantes directamente a partir de los vectoresb{j}
, que son mucho más pequeños en tamaño.