如何将单元格数组写入文本文件MATLAB,与dlmwrite错误

时间:2014-02-02 13:37:49

标签: matlab cell-array

我知道这是一个经常性的话题,我已经尝试了解人们提供的答案,但是没有一个似乎很容易转移到我的特定问题,因为解决方案通常是为了一个离我的方式太远的实现试图做

任何人都可以提供以下帮助。

当我运行下面的代码时,我得到:

Error using dlmwrite (line 118) The input cell array cannot be converted to a matrix.

Error in GAVNeuroScan (line 25) dlmwrite(outputfile, CondRowDone);

我举一个例子来说明我想在代码末尾的评论中实现的目标。

如果有人可以帮助我将CondRowDone的内容提供给文本文件,如评论中所示,那就太棒了!

studyname='TestGav';

subjects={'504','505'};

conditions={'HighLabel','LowLabel','HighSound','LowSound'};

nCond=4;

GFPorBMR='GFP';

for curCond=1:length(conditions)

    for curSubject=1:length(subjects)

        gavRow{curSubject}=[subjects(curSubject) '-' conditions{curCond} '-' GFPorBMR '.avg'];
    end


       CondRowDone{curCond,:}=['GROUPAVG' '{' gavRow '}' 'G Y 1 N N' conditions{curCond} 'avg.'];

end

outputfile = [studyname '_GAV_' curSubject '.txt'];
dlmwrite(outputfile, CondRowDone);

% What I want is a text file that would look exactly like that. I think I'm
% not far but it fails to write...
%
% GROUPAVG {{HighLabel-504-GFP.avg} {HighLabel-505-GFP.avg}} G Y 1 N N {HighLabel.avg} 
% GROUPAVG {{LowLabel-504-GFP.avg} {LowLabel-505-GFP.avg}} G Y 1 N N {LowLabel.avg} 
% GROUPAVG {{HighSound-504-GFP.avg} {HighSound-505-GFP.avg}} G Y 1 N N {HighSound.avg} 
% GROUPAVG {{LowSound-504-GFP.avg} {LowSound-505-GFP.avg}} G Y 1 N N {LowSound.avg} 

2 个答案:

答案 0 :(得分:1)

从我看到的使用调试器的情况来看,你在花括号作为文本和花括号来处理MATLAB单元数组时会有一些混淆。

这是对for - 循环的重写,以生成您在代码示例中给出的字符串的单元格数组。此外,要生成您指定的确切输出,主题和条件必须以不同的顺序给出:

for curCond=1:length(conditions)
    gavRow = [];

    for curSubject=1:length(subjects)

        if (curSubject ~= 1)
            gavRow = [gavRow ' '];
        end

        gavRow = [gavRow '{' [conditions{curCond} '-' subjects{curSubject} '-' GFPorBMR '.avg'] '}'];
    end


    CondRowDone{curCond}=['GROUPAVG ' '{' gavRow '} ' 'G Y 1 N N {' conditions{curCond} '.avg}'];

end

至于将字符串写入磁盘的任务,MATLAB告诉您它无法将您的单元格数组作为矩阵处理。在将单元阵列写入磁盘时,我认为你必须自己使用低级函数编写它,如下所示:

outputfile = [studyname '_GAV_' curSubject '.txt'];

fid = fopen(outputfile, 'w');
for i=1:length(CondRowDone)
    fprintf(fid, '%s\n', CondRowDone{i});
end
fclose(fid);

答案 1 :(得分:0)

dlmwrite仅处理数字数据。解决这个问题的一种方法,如果你有Excel,就是使用xlswrite - 它可以直接接收(某些类型的)单元格数组。

xlswrite(outputfile, CondRowDone);

然后,执行一些批量xls到csv转换(例如,请参阅this question和答案)。要直接获取文本文件,您需要使用较低级别的命令(如blackbird的答案)。