在Matlab中读取包含二进制数据的文本文件作为单个矩阵

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的矩阵来计算列的总和。

假设您的代码出现错误,您应该能够将其作为文本阅读。您能展示一下吗? - bdecaf
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);

5

这里提供一种略带技巧性的方法:

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

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

分解:

  1. textread 会将每行0和1读取为单个字符串。因此,A 将成为一个单元字符串,其中每个元素都等于长度为125的字符串。
  2. cat(1,A{:}) 将单元字符串连接成一个 "正常" 的 Matlab 字符数组,大小为840946 x 125。
  3. 从由0和1组成的任何字符数组中减去 ASCII 值 '0' 将返回它们的数字表示。例如,'a'-0 = 97,即小写字母 'a' 的 ASCII 值。
  4. sum 最终会对该数组的列求和。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接