Operación unaria usando bucles for en Matlab
Frecuentes
Visto 108 equipos
0
Estoy tratando de hacer algo de aritmética básica dentro de un for
bucle en MatLab.
Básicamente, quiero copiar y operar en cada elemento uno por uno. Primero quiero restar 3.6: testDataMean
de cada elemento, elevar cada elemento a la potencia de 2
luego sumar cada variable. Finalmente dividimos la variable s
by 5
(sizeOfTestData
)
Esto debería calcular aproximadamente ~1.05.
El testData
variable es un vector de 1x5 que contiene los números 3, 4, 2, 5, 4
s = 0;
for k = 1:sizeTestData
p = testData(k);
q = p - testDataMean;
r = q^2;
s = s + r;
s/5;
end
Este bucle en realidad arroja un error en la última línea s = s + r
. Soy consciente de que puedo usar el sum
funcionan en la mayoría de las circunstancias cuando se opera en vectores del mismo tamaño, pero en el contexto de un bucle for no estoy seguro.
1 Respuestas
3
Tenga en cuenta que sum(s) / numel(s)
por definición es lo mismo que mean(s)
.
El enfoque libre de bucles:
testData = [3, 4, 2, 5, 4]
q = testData - mean(testData);
s = mean(q.^2);
s = 1.0400
El one-liner:
s = mean((testData-mean(testData)).^2)
s = 1.0400
Y su enfoque inicial:
(Después de la corrección de errores)
testData = [3, 4, 2, 5, 4]
s = 0;
sizeTestData = length(testData);
testDataMean = mean(testData);
for k = 1:sizeTestData
p = testData(k);
q = p - testDataMean;
r = q^2;
s = s + r;
end
s = s / numel(s);
s = 1.0400
Respondido 08 Feb 14, 13:02
Gracias por la respuesta. Lo siento, me perdí un punto vital al final que era dividir la variable resumida s
by 5
. He editado mi publicación original para adaptarla. - user1574598
Gracias, probaré tu solución, pero sí, eso es lo que quería. Solo estoy practicando el concepto de RMSE (error cuadrático medio). - user1574598
@user1574598: Programar Matlab de manera eficiente tiene mucho que ver con evitar bucles siempre que sea posible. Por lo tanto, la frase de Daniel no es solo una sino al Forma de Matlab para calcular el RMSE. Excepto que es posible hacerlo aún más corto: s = var(testData, 1)
;-)- A. Donda
Gracias, es útil saber cómo evitar bucles :-) Seguiré practicando y espero mejorar. ¡Es increíble cómo se pueden reducir 6-8 líneas de código a una! - user1574598
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas matlab for-loop unary-operator or haz tu propia pregunta.
¿Cuál es el error? "Dimensiones de la matriz deben estar de acuerdo"? - Stewie Griffin
Lo siento, dice "Función indefinida o variable 's'" - user1574598
Pues ahí tienes tu respuesta. Poner
s = 0
frente al bucle. - Stewie Griffin