用于绘图的元胞数组到数值数组
cell array to numeric array for plotting
我有一个包含历史黄金价格数据的元胞数组和一个包含相关日期的元胞数组。我想根据价格绘制日期以进行简单分析,但我很难将价格元胞数组转换为双精度数。
我的代码是:
figure
plot(Date,USDAM,'b')
title('{\bf US Gold Daily Market Price, 2010 to 2015}')
datetick
axis tight
当我尝试使用 cell2mat(USDAM)
将黄金价格 (USDAM
) 转换为双精度时,它会抛出以下错误:
Error using cat
Dimensions of matrices being concatenated are not consistent.
Error in cell2mat (line 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};
对于你的问题,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
中的字符串)。请注意,为了设置刻度标签,您必须确保您拥有与缩进标签相同(相同)的刻度数。但我认为这是一个不同的问题。
我有一个包含历史黄金价格数据的元胞数组和一个包含相关日期的元胞数组。我想根据价格绘制日期以进行简单分析,但我很难将价格元胞数组转换为双精度数。
我的代码是:
figure
plot(Date,USDAM,'b')
title('{\bf US Gold Daily Market Price, 2010 to 2015}')
datetick
axis tight
当我尝试使用 cell2mat(USDAM)
将黄金价格 (USDAM
) 转换为双精度时,它会抛出以下错误:
Error using cat Dimensions of matrices being concatenated are not consistent.
Error in cell2mat (line 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};
对于你的问题,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
中的字符串)。请注意,为了设置刻度标签,您必须确保您拥有与缩进标签相同(相同)的刻度数。但我认为这是一个不同的问题。