es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for 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 de b{j} en todas las matrices es el mismo para todos los j = 1, ..., 28. Por lo tanto, podemos calcular el valor medio mu de cada b{j} por separado y utilizarlo para calcular directamente la desviación máxima y mínima de cada b{j} respecto al valor medio en todas las matrices.

    Aquí tienes una versión actualizada del código que implementa este enfoque:

    clear
    rng default
    A=cell(28,1);
    r=randi(10000,28,1)+10000; %28x1
    for j=1:28
        A{j}=randn(r(j),4); %r(j)x4
    end
    
    % Paso 2: Calcular b{j} para cada matriz 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
    
    % Paso 3: Calcular el valor medio mu de cada b{j}
    mu=zeros(28,1);
    for j=1:28
        mu(j)=mean(b{j});
    end
    
    % Paso 4: Calcular la desviación máxima y mínima de cada b{j} respecto a mu
    F=zeros(2,28);
    for j=1:28
        F(1,j)=min(abs(b{j}-mu(j)));
        F(2,j)=max(abs(b{j}-mu(j)));
    end
    
    

    En esta versión del código, calculamos directamente el valor medio mu de cada b{j} utilizando la función mean. Luego, calculamos la desviación máxima y mínima de cada b{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 de r(1), ..., r(28). En su lugar, calculamos las cantidades relevantes directamente a partir de los vectores b{j}, que son mucho más pequeños en tamaño.

Comments are closed.