单元格数组到数字数组用于绘图

时间:2015-01-02 12:52:18

标签: arrays string matlab cell-array textscan

我有一个包含历史金价数据的单元格数组和一个包含相关日期的单元格数组。我想将日期与价格进行简单分析,但我很难将价格单元格转换为双打。

我的代码是:

figure
plot(Date,USDAM,'b')
title('{\bf US Gold Daily Market Price, 2010 to 2015}')
datetick
axis tight

当我尝试使用USDAM将金币价格(cell2mat(USDAM))转换为双倍时,会引发以下错误:

  

使用cat时出错   连接的矩阵的尺寸不一致。

     

cell2mat出错(第83行)               m {n} = cat(1,c {:,n});

我使用以下代码导入数据:

filename = 'goldPriceData.csv';
delimiter = ',';
startRow = 2;
endRow = 759;
formatSpec = '%s%s%*s%*s%*s%*s%*s%[^\n\r]';

fileID = fopen(filename,'r');


dataArray = textscan(fileID, formatSpec, endRow-startRow+1, 'Delimiter', delimiter, 'EmptyValue' ,NaN,'HeaderLines', startRow-1, 'ReturnOnError', false);

fclose(fileID);

Date = dataArray{:, 1};
USDAM = dataArray{:, 2};

1 个答案:

答案 0 :(得分:1)

对于您的问题,cell2mat功能错误。考虑字符串的单元格数组:

>> S = {'1.2';'3.14159';'2.718'}
S = 
    '1.2'
    '3.14159'
    '2.718'
>> cell2mat(S)
Error using cat
Dimensions of matrices being concatenated are not consistent.
Error in cell2mat (line 83)
            m{n} = cat(1,c{:,n}); 

那是因为输出的每一行需要具有相同的列数,所以字符串的长度不同。你可以使用strvcat(S)得到一个用空格填充的矩形矩阵,但这并不是你想要的。你想要数字数据。

>> str2double(S)
ans =
    1.2000
    3.1416
    2.7180

仅仅因为它用科学记数法表示数字,并不意味着数字不同。也就是说,1.199250000000000e+03 1199.25。要使刻度标签看起来如您所愿,请使用格式化字符串设置轴的YTickLabel属性,USD中的{。}}。

关于您的日期,您需要在每个轴上绘制数字数据,因此请将日期转换为datenum

>> dateVals = datenum({'2014-12-30', '2014-12-31'})
dateVals =
      735963
      735964

然后,要正确显示x轴上显示的日期,请设置轴的XTickLabel属性以使其看起来如何(使用Dates中的字符串)。请注意,要设置刻度标签,您必须确保您具有与缩进的标签正确(相同)的刻度数。但我认为这是一个不同的问题。