Tengo un bucle que se repite a lo largo de una matriz…

for i=1:length(myArray)

En este bucle, quiero hacer ver el valor de myArray y agregar a otra matriz myArray2 si cumple ciertas condiciones. Miré a través de MATLAB docs, pero no podía encontrar nada en la creación de matrices sin declarar todos sus valores en la inicialización o la lectura de los datos en ellos en una sola toma.

Muchas gracias!

InformationsquelleAutor Mark | 2010-03-19

2 Comentarios

  1. 7

    Supongo que quieres algo más complicado de lo que

    myArray = [1 2 3 4 5];
    myArray2 = myArray(myArray > 3);

    La forma más fácil (pero más lento) en el camino de hacer lo que estamos pidiendo es algo así como

    myArray2 = [];
    for x = myArray
        if CheckCondition(x) == 1
            myArray2 = [myArray2 x]; %# grows myArray2, which is slow
        end;
    end;

    Puede ordenar de optimizar este con algo como

    myArray2 = NaN(size(myArray));
    ctr = 0;
    for x = myArray
        if CheckCondition(x) == 1
            ctr = ctr + 1;
            myArray2(ctr) = xx;
        end;
    end;
    myArray2 = myArray2(1:ctr); %# drop the NaNs

    También puede que desee ver en ARRAYFUN.

    • ¿Por qué se han utilizado los Nan, ¿puedo usar ceros o unos?
    • puede, sí.
  2. 2

    Para la mayor parte, la manera de hacer lo que estás describiendo es como mtrw dijo que en el primer ejemplo.

    Digamos data = [1 2 3 4 5 6 7 8 9 10], y de la que desea obtener sólo los números pares.

    select = mod(data,2)==0; % This will give a binary mask as [0 1 0 1 0 1 0 1 0 1].

    Si usted data2=data(select), que le dará [2 4 6 8 10].

    Por supuesto, la manera más rápida de hacer esto es como mrtw había en el ejemplo 1:

    data2=data(some_criteria);
    • Sólo una pequeña precisión. La máscara debe ser una matriz de logicals, parece. He probado con select=[0 1 0 1…] y tengo un error «Subíndice índices deben ser real enteros positivos o logicals». Luego he intentado con select=[false true false true…] y funcionó como se esperaba.

Dejar respuesta

Please enter your comment!
Please enter your name here