我尝试从文本文件导入数据。数据文件格式应该是第一行是char而其他是数字,就像xls文件一样。但是该文件是由其他软件生成的文本文件,其中所有数据都在一行中,一个空格键分开,并且“' tab'作为一个新的数据行。
我想导入matlab的数据格式应该是这样的:
malloc()
但现在文本文件中的数据是
A B C D
1 2 3 4
5 6 8 8
8 0 9 5
我应该如何将矩阵中的文本文件导入matlab?我试过A B C D 1 2 3 4 5 6 8 8 8 0 9 5
但是ans是4x1单元格。我的Matlab版本是2008年。
抱歉,我对matlab很新。谢谢。
编辑: 我意识到数据是
importdata
请你告诉我如何将这些东西放入牢房,请一个字母/一号电池好吗?
A B C D 1 2 3 4 5 6 8 8 8 8 0 9 5 7 0 8 8 8 5 0 9 9
当我按建议使用cell2mat时,错误消息为 A B C D
1 2 3 4
5 6 8 8 8
8 0 9 5
7 0 8 8 8
5 0 9 9
非常感谢!
答案 0 :(得分:1)
让我们从您从文本文件生成的单元格数组开始。我称之为A
。这是一个4x1。或者1x4?通过以下行,我们确保从同一点开始:
A = A(:); % make sure A is columnar
A
是一个单元格数组,第一个元素包含名称,第二个元素包含数字作为字符串。
案例1:每个部分的大小一致:制作矩阵
这里我们将看到如何从这个单元格数组中提取所需的矩阵。
首先,我们需要strread
从字符串中创建一个向量(您也可以使用textscan
):
v = strread(A{2})
v =
1 2 3 4
现在我们应该在每个单元格上应用此函数并将矩阵中的向量组合起来。这可以使用cellfun
来实现,但由于我们必须先生成一个单元格数组,最后我们需要一个cell2mat
:
M = cell2mat(cellfun(@strread, A(2:end), 'UniformOutput', false))
此处,M
是最终结果。
M =
1 2 3 4
5 6 8 8
8 0 9 5
案例2:大小不一致+组合字符/数字:制作单元格数组
我们希望将数据转换为单元格数组,每个元素占用一个单元格。从celldata
的第一行开始,我们可以使用strsplit
将名称字符串分解为单元格数组:
celldata = strsplit(A{1});
% maximum data count in each cell of A
maxL = max(cellfun(@(x) numel(strsplit(x)), A));
% constructing an empty cell array to be filled with the data
% the importance of this step dramatically increases with the data size!
celldata{numel(A), maxL} = [];
现在,您可以浏览celldata
并使用正确的值填充其单元格:
for ii = 2:numel(A)
val = strread(A{ii});
celldata(ii, 1:numel(val)) = num2cell(val);
end
celldata
是这种形式的单元格数组:
celldata =
'A' 'B' 'C' 'D' []
[1] [2] [3] [4] []
[5] [6] [8] [8] [8]
[8] [0] [9] [5] []
[7] [0] [8] [8] [8]
[5] [0] [9] [9] []