2013-10-29 219 views
1

目前我有一个435x1单元阵列,它是由importdata组成的。每个元素是一个由逗号分隔的17个值的字符串。Matlab单元阵列

我想让字符串填满每行的列,而不是每行包含一个元素的字符串。所以基本上,我想要一个435x17单元格数组,其中每个元素是一个单元格数组,而不是435x1单元格数组,每个元素都是一个字符串。

到目前为止我已经得到最接近的是:

data = importdata('my_data.data'); 
for x=1:size(data,1) 
    data(x,:) = {strsplit(data{x}, ',')}; 
end 

这将使在每个元素的单元阵列的字符串。通过上面的代码,我仍然有一个435x1单元阵列,但是每个单元现在都是1x17单元阵列。

有谁能告诉我把它变成一个435x17单元阵列吗?任何帮助表示赞赏。

从数据文件中的一行是这样的:

republican,n,y,n,y,y,y,n,n,n,y,?,y,y,y,n,y 

有435行的字符串。我想要一个435x17单元格数组,其中列是由逗号分隔的字符串。

回答

2

尝试是这样的:

temp_data = importdata('my_data.data'); 
data = cell(size(temp_data,1),17); 
for x=1:size(temp_data,1) 
    data(x,:) = strsplit(temp_data{x}, ','); 
end 
clear temp_data; 
0

你有任何样本数据?也许只是csv文件的几行?

无论如何,如果您有R2013b,您应该可以使用表格进行此操作。对于“data.csv”文件:

republican,n,y,n,y,y,y,n,n,n,y,?,y,y,y,n,y 
democrat,y,n,y,n,n,n,y,y,y,n,!,n,n,n,y,n 

您可以使用table然后导入到MATLAB这样的:

>> t = readtable('data.csv','ReadVariableNames', false) 

t = 

     Var1  Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10 Var11 Var12 Var13 Var14 Var15 Var16 Var17 
    ____________ ____ ____ ____ ____ ____ ____ ____ ____ _____ _____ _____ _____ _____ _____ _____ _____ 

    'republican' 'n'  'y'  'n'  'y'  'y'  'y'  'n'  'n'  'n'  'y'  '?'  'y'  'y'  'y'  'n'  'y' 
    'democrat'  'y'  'n'  'y'  'n'  'n'  'n'  'y'  'y'  'y'  'n'  '!'  'n'  'n'  'n'  'y'  'n' 

那你是怎么可以很容易地创建一个表。我也建议寻找到只使用一个表来保存这些数据,而不是处理它作为一个单元阵列,因为它是由处理数据处理任务,并具有功能,可能与你正在尝试做的帮助。但是,如果你真的需要它是一个单元阵列可以肯定只是表转换成细胞:

>> c = table2cell(t) 

c = 

    'republican' 'n' 'y' 'n' 'y' 'y' 'y' 'n' 'n' 'n' 'y' '?' 'y' 'y' 'y' 'n' 'y' 
    'democrat'  'y' 'n' 'y' 'n' 'n' 'n' 'y' 'y' 'y' 'n' '!' 'n' 'n' 'n' 'y' 'n' 

>> size(c) 

ans = 

    2 17 

希望帮助!

+0

嗨,我用数据样本更新了我的答案。 – Sterling

+0

谢谢,我已经更新了我的答案,使用您的数据与另一个被欺骗的民主党人线,这是共和党的行相反:-) 我也已经添加了如何将表转换为单元格数组,但可能会不是你想要做的。 –

+0

我明白了。我不知道readtable只适用于r2013b。我正在使用r2013a。希望你的回答能够帮助其他人。 – Sterling

2

您可以使用cat来做到这一点。这里有一个小例子:

data = {{1,2,3};{4,5,6};{7,8,9};{10,11,12}}; 
size(data) 
ans = 

    4 1 

newData = cat(1,data{:}); 
size(newData) 
ans = 

    4 3 

编辑: 如果你有一个字符串单元阵列,而不是,你可以做到以下几点:

data = {{'123'};{'456'};{'789'};{'abc'}}; 
size(data) 
ans = 

    4 1 

data2 = cat(1, data{:}); 
data3 = cell2mat(newData); 
size(data3) 
ans = 

    4 3 

data3 = 

123 
456 
789 
abc 
+0

嗨,这适用于您发布的示例,但不适用于我的示例。每个元素实际上是一个字符串,而不是一个单元格数组(直到我运行该代码块时,我“关闭”了)。有没有什么办法可以直接从字符串的单元格数组到nxm单元格数组,n =字符串的数量,m =字符串的长度? – Sterling

0

如果您没有R2013b,或者因为某些原因不想使用表格,您也可以这样做:

cellData = cell(numel(data), 17); % preallocate 
for idx=1:numel(data) 
    cellData(idx,:) = strsplit(data{idx}, ','); 
end