2015-09-25 171 views
-2

我想导入一些数据在一个m文件。因此,我设法创建了数据的单元阵列。我想将它转换成矩阵。我用cell2mat但我得到一个错误。我是Matlab的新手,所以我想要一些帮助。这里是我完整的代码cellarray在矩阵matlab

fid = fopen('vessel-movements.csv'); 
C = textscan(fid, '%f %f %f %f %f %s %s %s', 'HeaderLines', 1, 'Delimiter', ',') 
fclose(fid); 
iscell(C) 
T = cell2mat(C) 

我得到的答案是:

C = 
Columns 1 through 4 

[300744x1 double] [300744x1 double] [300744x1 double] [300744x1 double] 

Columns 5 through 8 

[300744x1 double] {300744x1 cell} {300744x1 cell} {300744x1 cell} 

ans = 

    1 

???错误使用==> cell2mat at 46 输入单元格数组的所有内容必须具有相同的数据类型。

错误==>测试在5 T = cell2mat(C)

我的问题是如何做呢?数据位于以下链接vessel-movements.csv。它包含数字,ID和坐标以及时间戳。

+1

第6列你有字符串数据。你打算如何将它们存储在矩阵中? – Divakar

回答

0

作为错误消息指出:

输入单元阵列的所有内容必须是相同的数据类型的。

列6,7和8是字符(日期字符串)。无法将它们转换为Matrix。把他们留在一个牢房里。

您只能将数值数据转换为矩阵:data = cell2mat(C(:,1:5))。左三列必须用datenum()转换成数字时间,以将其添加到data矩阵。

当你有> = R2013b,可以作为数据类型使用一个表,如:data = readtable('vessel-movements.csv');

+0

谢谢!不幸的是,我在膝上型电脑上使用Matlab,因此安装的版本是R2011b。因为我需要数值和时间我也会使用datenum(),然后我将它添加到数据矩阵 – vasouli

0

我假设你只想转换C的前五列,它们是包含数字数据的列。可以使用cell2mat如下:

M = cell2mat(C(:,1:5)); 

或等效

M = [C{:,1:5}]; 
0

基质和单元阵列(在MATLAB说法)之间的主要差别是,保持矩阵的元素相同的类型和大小,而单元阵列包含不同类型和大小的元素。

您读取数字和字符串。数字具有相同的类型和大小(double,1 × 1),而字符串不同(他们都是char类型,但通常不同的大小)。

,以便将数字数据,您只能选择您的单元阵列的数字元素:

N = horzcat(C{1:5}); 

而对于字符串,你应该保持单元阵列结构:

S = horzcat(C{6:8}); 

后来编辑:既然你承认你是MATLAB新手,我会提出一个一般性建议:每当你看到一个函数,你不知道它在做什么—或意外的表现查看—标记其名称并按F1。 MATLAB文档非常全面,并且还包含很多描述该函数典型用法的示例。