2

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

0 1 1 0 
1 1 1 0

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

0110
1110

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

有谁知道这样做的干净方法?谢谢

4

4 回答 4

6

这是一种方法:

数据.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 是可能的值。

于 2012-06-04T16:51:05.527 回答
1

改编自此处的示例:

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
于 2012-06-04T16:50:21.623 回答
0

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

arrayfun(@str2double, str);
于 2012-06-04T16:54:29.563 回答
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。第二段代码仅读取这些值的向量,然后对结果进行整形——如果您已经知道数据的大小,这可以正常工作,但如果不知道,则可能需要额外的工作。

如果您的实际文件非常大,您可能会发现其中一种方法更快,尽管如果不实际并排运行它们很难判断。

于 2012-06-04T19:38:33.057 回答