使用xlswrite保存数组中的数据? MATLAB

时间:2014-06-20 13:49:47

标签: matlab user-interface xls

我已经使用matlab创建了一个GUI,最后用户可以选择保存数据并将其保存到他们选择的excel文件中。
保存两个单独的数据集并将其写入excel文件。第一个是一个数值IntensityValue2,例如4592.25OtherAUC2,它是不同数值的数组,例如[] [5025.8] [5012.3] [4963.45]
这是我正在使用的代码:

% --- Executes on button press in Save.
function Save_Callback(hObject, eventdata, handles)
% hObject    handle to Save (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
IntensityValue = getappdata(0,'IV');

[FileName,PathName]= uigetfile('*.xlsx*','File to save to');
intensityfile = fullfile(PathName,FileName);
filename = intensityfile;
mypeak = {'Peak(nm)'};
xlswrite(filename,mypeak,'Sheet1','A1');
myintensity = {'Intensity'};
  xlswrite(filename,myintensity,'Sheet1','B1');
IntensityValue2 = str2num(IntensityValue);
  xlswrite(filename,IntensityValue2,'Sheet1','B2');
OtherAUC = getappdata(0,'AUC')
numfiles = getappdata(0,'files');
for a = 2:numfiles
    OtherAUC2{a} = OtherAUC{a}
end
xlswrite(filename,OtherAUC2,'Sheet1','B3');  

目前excel文件看起来像这样:

Peak(nm)  Intensity
          4592.25  
                    5025.8  5012.3  4963.45  

我希望它看起来像这样:

Peak(nm)   Intensity  
           4592.25
           5025.8  
           5012.3  
           4963.45  

有人可以帮助我实现这个目标吗?我意识到OtherAUC2中第一个单元格是空的,但我认为foor循环意味着第一个单元格没有写入excel文件。任何帮助或建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

回顾一下:

xlswrite将数据写入excel文件时,布局将与MATLAB中的布局相同。因此,如果您有一个1x4数组,它将写入一行,如果您有一个4x1数组,它将写入一列。要重塑此数组,您可以使用MATLAB的transpose函数,该函数通常缩写为.'(复共轭)或'(转置)。在这种情况下,这三者都是等价的。

因此,对于您的应用程序,您有两种方法:

OtherAUC2 = OtherAUC2.';
xlswrite(filename,OtherAUC2,'Sheet1','B3');

% or

xlswrite(filename,OtherAUC2.','Sheet1','B3');

这两种方法都应该为您提供您正在寻找的结果。

对于第二部分,您的for循环只需要进行调整。你在2处开始循环索引是正确的,以便跳过空白值,但是你忘了考虑新数组中的索引移位。

您需要做的就是从OtherAUC2索引中减去一个:

for a = 2:numfiles
    OtherAUC2{a-1} = OtherAUC{a}
end

或者,您可以删除没有循环的空单元格:

OtherAUC = OtherAUC(~cellfun(@isempty, OtherAUC));

cellfun将指定的函数应用于单元格数组中的每个单元格,这在许多情况下消除了对循环的需要。在这里,它正在做的是通过每个单元格并查看它是否为空。然后,它将OtherAUC重新定义为每个非空的单元格。这是logical indexing的示例(~cellfun(@isempty, OtherAUC)返回1x4逻辑数组,其中FALSE是一个空单元格。)

你可以用数值数组完成同样的事情:

test = [NaN,2,3,4];
test(isnan(test)) = [];

% or

test = [0,2,3,4];
test(test==0) = []; 

在比较非整数而不使用公差时,请注意floating point errors