MATLAB:如何从文件加载没有分隔符的数组

时间:2012-06-04 16:36:13

标签: matlab file-io

到目前为止,我一直在使用load函数将我的空格分隔文件加载到matlab中的数组中。但是这对我来说浪费了很多空间,因为我的值是0或1.因此不是像

那样编写文件
0 1 1 0 
1 1 1 0

我删除了空格以创建一半大文件,如:

0110
1110

然而现在加载不再正常工作(创建一个矩阵,我想只有第一个数字,所以2x1而不是2x4)。 我用importdata环顾四周,逐行阅读文件和许多其他东西,但我找不到一个明确的解决方案。 所以基本上我想从一个没有分隔符的文件中读取矩阵。每个数字都是数组的元素

有谁知道干净的方法吗? 感谢

4 个答案:

答案 0 :(得分:6)

这是一种方式:

data.txt中

0110
1110

MATLAB

%# read file lines as cell array of strings
fid = fopen('data.txt','rt');
C = textscan(fid, '%s', 'Delimiter','');
fclose(fid);

%# extract digits
C = cell2mat(cellfun(@(s)s-'0', C{1}, 'Uniform',false));

结果:

C =
     0     1     1     0
     1     1     1     0

如果您真的关心内存,可能会将其转换为布尔值:C = logical(C),因为0/1是可能的值。

答案 1 :(得分:1)

改编自示例here

function ret = readbin()
  fid = fopen('data.txt');
  ret = [];

  tline = fgetl(fid);
  while ischar(tline)
      if isempty(ret)
        ret = tline;
      else
        ret = [ret; tline];
      end
      tline = fgetl(fid);
  end

  % Turn char '0' into numerical 0
  ret = ret - 48;

  fclose(fid);
end

减去48('0'的ASCII代码),你得到一个数字矩阵,在适当的位置有1和0。这是我在函数末尾得到的输出:

K>> ret
ret =
     0     1     1     0
     1     1     1     0
K>> class(ret)
ans =
double

答案 2 :(得分:0)

受到这个问题的启发:Convert decimal number to vector,这是一个命题,但我不认为它适用于大型“数字”:

arrayfun(@str2double, str);

答案 3 :(得分:0)

另一种形式的Amro解决方案是

fid = fopen('data.txt','r');
C = textscan(fid, '%1d%1d%1d%1d');
fclose(fid);
M = cell2mat(C)

或者

fid = fopen('data.txt','r');
M_temp = textscan(fid, '%1d');
fclose(fid);
M = reshape(M_temp{1}, 2,4)

这些与Amro的解决方案略有不同,因为第一个读取%1d格式编号(1个字符整数)并返回可以使用更简单的cell2mat命令转换的单元格数组C.第二位代码只读取这些值的向量然后重新整形结果 - 如果您已经知道数据的大小,那么它可以正常工作,但如果没有则可能需要额外的工作。

如果您的实际文件非常大,您可能会发现其中一种方法更快,但如果没有实际并排运行它们很难说。