10

我有一个文本文件,其中包含以下方式的二进制数据:

00000000000000000000000000000000001011111111111111111111111111111111111111111111111111111111110000000000000000000000000000000
00000000000000000000000000000000000000011111111111111111111111111111111111111111111111000111100000000000000000000000000000000
00000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111100000000000000000000000000000000
00000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000
00000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111100000000000000000000000000000000
00000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111100000000000000000000000000000000
00000000000000000000000000000000000000011111111111111111111111111111111111111111111111000111110000000000000000000000000000000
00000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111110000000000000000000000000000000
00000000000000000000000000000000000000000000111111111111111111111111111111111111110000000011100000000000000000000000000000000
00000000000000000000000000000000000000011111111111111111111111111111111111111111111111100111110000000000000000000000000000000
00000000000000000000000000000000000111111111111111111111111111111111111111111111111111110111110000000000000000000000000000000
00000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000
00000000000000000000000000000000000000001111111111111111111111111111111111111111111111000011100000000000000000000000000000000
00000000000000000000000000000000000000001111111111111111111111111111111111111111111111000011100000000000000000000000000000000
00000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111000000000000000000000000000000000
00000000000000000000000000000000000000011111111111111111111111111111111111111111111110000011100000000000000000000000000000000
00000000000000000000000000000000000000000000011111111111111111111111111111111111100000000011100000000000000000000000000000000
00000000000000000000000000000000000000111111111111111111111111111111111111111111111111110111100000000000000000000000000000000

请注意,每个 1 或 0 都是独立的,即值不是十进制的。我需要找到文件的按列总和。总共有 125 列,有 840946 行。

我试过textread,fscanf和其他一些 matlab 命令,但结果是它们都以十进制格式读取每一行并创建一个840946x1数组。我想创建一个840946x125矩阵来计算列和。

4

2 回答 2

6

您可以使用 textread 来做到这一点。只需读取字符串,然后使用 sscanf 处理它们,一次一个数字

A = textread('data.txt', '%s');
ncols = size(A, 1);
nrows = size(A{1}, 2);
A = reshape(sscanf([A{:}], '%1d'), nrows, ncols);

请注意,现在 A 已转置,即您有 125 行。

然后简单地计算按列的总和

colsum = sum(A);
于 2012-10-03T09:51:52.447 回答
5

这是一个有点hack-ish的方法:

A = textread('data.txt', '%s');  

colsum = sum(cat(1,A{:})-'0')

分解:

  1. textread将每行 0 和 1 读取为单个字符串。A因此将是一个单元串,每个元素等于一个长度为 125 的字符串。
  2. cat(1,A{:})会将单元格字符串连接成大小为 840946×125 的“普通”Matlab 字符数组。
  3. 从包含 0 和 1 的任何字符数组中减去 ASCII 值“0”将返回它们的数字表示。例如,'a'-0 = 97小写“a”的 ASCII 值。
  4. sum最终将对该数组的列求和。
于 2012-10-03T10:15:08.070 回答