打印单元格在Matlab中输入

时间:2013-07-15 09:57:03

标签: matlab

我有一个像:

这样的单元格数组
>>text

'Sentence1'
'Sentence2'
'Sentence3'

每当我使用

sprintf(fid,'%s\n',text)

我收到错误说:

'Function is not defined for 'cell' inputs.'

但如果我说:

sprintf(fid,'%s\n',char(text))

它有效,但在文件中出现的所有句子都混合在一起,就像没有任何意义一样。

你能推荐我做什么吗?

我把文字拿到了:

>>text
'Title '
'Author'
'comments '
{3x1} cell

这就是为什么我不能使用文字{:}。

1 个答案:

答案 0 :(得分:0)

如果您发出

sprintf('%s\n', text)

你说“用换行符打印一个字符串。字符串就是这个单元格数组”。那不对;单元格数组不是字符串。

如果您发出

sprintf('%s\n', char(text))

你说“用换行符打印一个字符串。字符串是这个单元格数组,我将其转换为字符数组。”问题是,转换会产生单个字符数组,而sprintf将仅为多个输入重用%s\n格式。此外,它按列写出单个字符数组,意思是,第一列中的所有字符与第二列中的所有字符水平连接,与第三列中的所有字符连接,等等。

因此,对sprintf的适当调用是多个输入:

sprintf(fid, '%s\n', text{:})

因为单元格扩展text{:}从单元格数组中的所有条目创建一个以逗号分隔的列表,这正是sprintf / fprintf所期望的。

编辑如您所示:您在text中有非参赛作品。你必须检查一下。如果您只想将字符串传递给fprintf,请使用

fprintf(fid, '%s\n', text{ cellfun('isclass', text, 'char') })

如果{3x1 cell} 再次一组字符串,那么你想要递归写所有字符串,那么只需使用以下内容:

function textWriter 

    text = {...
        'Title'
        'Author'
        'comments'
        {...
            'Title2'
            'Author2'
            'comments2'
            {...
                'Title3'
                'Author3'
                'comments3'
            }
        }
    }

    text = cell2str(text);
    fprintf(fid, '%s\n', text{:});


end


function out = cell2str(c)

    out = {};
    for ii = c(:)'
        if iscell(ii{1})
            S = cell2str(ii{1});
            out(end+1:end+numel(S)) = S;
        else
            out{end+1} = ii{1};
        end
    end

end