到目前为止,我一直在使用load函数将我的空格分隔文件加载到matlab中的数组中。但是这对我来说浪费了很多空间,因为我的值是0或1.因此不是像
那样编写文件0 1 1 0
1 1 1 0
我删除了空格以创建一半大文件,如:
0110
1110
然而现在加载不再正常工作(创建一个矩阵,我想只有第一个数字,所以2x1而不是2x4)。 我用importdata环顾四周,逐行阅读文件和许多其他东西,但我找不到一个明确的解决方案。 所以基本上我想从一个没有分隔符的文件中读取矩阵。每个数字都是数组的元素
有谁知道干净的方法吗? 感谢
答案 0 :(得分:6)
这是一种方式:
0110
1110
%# 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.第二位代码只读取这些值的向量然后重新整形结果 - 如果您已经知道数据的大小,那么它可以正常工作,但如果没有则可能需要额外的工作。
如果您的实际文件非常大,您可能会发现其中一种方法更快,但如果没有实际并排运行它们很难说。