Supongamos que tengo un celular

v =    'v'    [576.5818]    [3.0286]    [576.9270]

       'v'    [576.5953]    [3.1180]    [576.8716]

       'f'    [      56]    [    58]    [      52]

       'f'    [      56]    [    58]    [      52]

y quiero convertir esto en una celda de la matriz mediante una cadena de formato para cada elemento:' %.5f'

¿Cómo puedo hacer esto? He probado el siguiente enfoque, pero me da un error:

f1 = @(x) sprintf('   %.5f',x);
cellfun(f1, num2cell(v),'UniformOutput', false) 

Estoy recibiendo un error como ???

Error using ==> sprintf

Function is not defined for 'cell' inputs.

Error in ==> @(x)sprintf(' %.5f',x)

Puede alguien ayudarme gracias de antemano

InformationsquelleAutor user1804229 | 2012-11-06

4 Comentarios

  1. 21

    Cadena es una matriz de células

    Bueno, en realidad no.. es una matriz, pero seguir leyendo.

    Supongo celda de la matriz es la más mística de tipo de datos en MATLAB. Así que vamos a desmitificar un poco 😉

    Asumir

    fruits = {...
        'banana',...
        'apple',...
        'orange'...
    }

    Primero de todos los enteros de la indexación no es necesario para arreglos pequeños. Es mucho mejor utilizar foreach-como construcciones. De hecho,

    for index = 1:numel(fruits)
        fruits{index}
    end

    es equivalente a

    for fruit = fruits
        fruit
    end

    derecho?

    Bueno, no del todo. Primer bucle produce cadenas, mientras que el segundo le da a las células. Se puede comprobar con

    for index = 1:numel(fruits)
        [isstr(fruits{index}) iscell(fruits{index})]
    end
    
    for fruit = fruits
        [isstr(fruit) iscell(fruit)]
    end

    es decir, [1 0] y [0 1].

    Si tiene lugar de la diferencia, entonces usted debe saber qué hacer con el siguiente ejemplo (en este es muy refieren a su pregunta (!) Prometo!). Decir que tratamos de hacer horizontal de la concatenación en un bucle:

    for fruit = fruits
        [fruit 'is a fruit']
    end

    Obtendrá

    ans = 
    
        'banana'    'is a fruit'

    y así sucesivamente. Por qué? Al parecer este código intenta concatenar un entramado de células de la matriz en una cadena (una celda de la matriz que contiene una matriz de caracteres que constituyen la cadena como ‘banana’). Así, la respuesta correcta es

    Uso {:}

    for fruit = fruits
        [fruit{:} 'is a fruit']
    end

    Por arte de magia este ya se produce el esperado ‘banana es una fruta’, ‘manzana es una fruta’, etc.

    Sugerencias

    Un par de sugerencias:

    • Índice libre de bucle funciona muy bien con estructuras como en for fruit = [fieldnames][1](fruits)'
    • El de arriba es verdadero de código abierto octava
    • plátano no es sólo fruto, taxonómicamente también es una hierba 😉 como en la ‘banana’ en MATLAB es una cadena y una matriz, es decir, assert(isstr(‘banana’) && ismat(‘banana’)) pasa, pero assert(iscell(‘banana’)) falla.
    • {:} es equivalente a cell2mat

    PS

    una solución a su pregunta puede tener este aspecto:

    Dado

    vcell = {...
        'v'    576.5818    3.0286  576.9270;
        'v'    576.5818    3.0286  576.9270    
    }

    encubierta índice de sabios sólo tipos numéricos en cadenas

     vcell(cellfun(@isnumeric, vcell)) =  cellfun(@(x) sprintf('%.5f', x), vcell(cellfun(@isnumeric, vcell)), 'UniformOutput', false)

    Código anterior salidas

    vcell =

    'v'    '576.58180'    '3.02860'    '576.92700'
    'v'    '576.58180'    '3.02860'    '576.92700'

    que pueden ser concatenados.

  2. 7

    Supongamos que tenemos una celda de la siguiente manera:

    my_cell = {'Hello World'}  
    class(my_cell)
    ans = 
    cell

    Podemos obtener la cadena de simplemente mediante el uso de la {:} operador directamente en ella.

       class(my_cell{:})
        ans =
        char

    Tenga en cuenta que podemos utilizar la expresión mycell{:} en cualquier lugar nos gustaría utilizar una cadena normales.

    • Camino a seguir! Nunca digas gravedigging nunca ha ayudado a nadie.
    • llamar superfluo llamada a la función sprintf un hack es un lol

Dejar respuesta

Please enter your comment!
Please enter your name here