【问题标题】:how to write cell array to text file MATLAB, error with dlmwrite如何将单元格数组写入文本文件 MATLAB,dlmwrite 出错
【发布时间】:2014-02-02 13:37:48
【问题描述】:

我知道这是一个反复出现的话题,我已经尝试理解人们提供的答案,但似乎没有一个容易转移到我的特定问题上,因为解决方案通常是针对与我的实现相距甚远的实现努力去做

任何人都可以帮助解决以下问题。

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

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

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

我在代码末尾给出了我想在 cmets 中实现的示例。

如果有人可以帮助我将 CondRowDone 的内容保存到文本文件中,如 cmets 所示,那就太好了!

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} 

【问题讨论】:

    标签: matlab cell-array


    【解决方案1】:

    从我使用调试器看到的情况来看,您对作为文本的花括号和用于处理 MATLAB 元胞数组的花括号之间有些混淆。

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

    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);
    

    【讨论】:

    • 酷到近乎完美!只是一个快速的问题。看起来虽然CondRowDone 中的列数与条件一样多,但这并没有转化为文本文件。换句话说,当我运行代码时,我只会将第一列写成一行。知道该怎么做吗?最后,让我理解并从中学习:if 循环广告列到 gavRow?
    • 哦,为什么不可能在示例中显示的方向上具有条件和主题。抱歉,我真的不太擅长 MATLAB。
    • @Bastien:对于您的第一条评论:这是在第二个 for 循环中使用 size(CondRowDone, 1) 的错误。我更正了我的代码以使用length(CondRowDone)。当然,可以按照所示方向获取条件和主题,请参阅更新的答案。
    • 非常感谢。是的,在那之后我意识到这只是交换 gavRow 的问题。是的!我真的应该发现这个“错误”。您能否回复我重新执行if 循环。是否指示添加列?我说的对吗?
    • 循环中的if 所做的只是添加一个空格字符,这样{HighLabel-504-GFP.avg} 将与下一个{HighLabel-505-GFP.avg} 隔开一个空格。仅当 curSubject 不等于 1 时才执行此操作,换句话说,对于除第一个主题之外的每个主题。
    【解决方案2】:

    dlmwrite 只处理数字数据。解决此问题的一种方法是,如果您有 Excel,则使用 xlswrite - 它可以直接接收(某些类型的)元胞数组。

    xlswrite(outputfile, CondRowDone);

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

    【讨论】:

    • 好的,也感谢这个指针。我确实尝试过 xlswrite,但由于某种原因无法加载 Excel……Blackbird 的回答让我朝着正确的方向前进。感谢您的意见:)
    猜你喜欢
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2018-10-02
    相关资源
    最近更新 更多