我有一个文本文件,如:
[ 1, 2, 3;
2, 4, 5;
2, 2, 2;
8, 3, 3 ]
在Octave / Matlab中将此作为矩阵加载的最快方法是什么?我希望将其视为一个包含4行和3列的矩阵。
答案 0 :(得分:1)
用鼠标在MATLAB(显示所有当前变量的区域)上的工作区拖动文本文件并将其放在那里。这将打开“导入”窗口:
为文件命名(我的当前为“NewTextDocument2”)并在右上角选择IMPORT。 MATLAB将处理分号和括号。如果您想拥有执行此操作的功能,请选择“生成功能”而不是IMPORT。
答案 1 :(得分:0)
我不确定它是否是最简单的。
fid = fopen('filename.txt','r');
C = textscan(fid, '%f %f %f', ...
'Delimiter',' ','MultipleDelimsAsOne', 1);
fclose(fid);
DataMatrix = cat(2,C{:});
答案 2 :(得分:0)
如果您的文件只包含数字,则可以使用Matlab load()
function。此函数通常用于加载.mat
个文件。但是它能够处理matlab调用ASCII
格式文件。
假设您的文件纯文字,仅包含数字,结构如下:
filename.txt
1 2 3
2 4 5
2 2 2
8 3 3
load函数将创建一个名为filename
的变量,其中包含您的数组:
> load('filename.txt');
> filename =
[ 1, 2, 3;
2, 4, 5;
2, 2, 2;
8, 3, 3 ]
答案 3 :(得分:0)
快速really dirty方法使用generally non-recommended函数eval
:
fid = fopen('data.txt');
s = fscanf(fid, '%s');
fclose(fid);
eval(['dataMatrix = ' s ';']);
答案 4 :(得分:0)
这适用于您当前的textfile格式。
使用此函数importfile.m:
function filename = importfile(filename, startRow, endRow)
delimiter = ',';
if nargin<=2
startRow = 1;
endRow = inf;
end
formatSpec = '%s%s%s%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, endRow(1)-startRow(1)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(1)-1, 'ReturnOnError', false);
for block=2:length(startRow)
frewind(fileID);
dataArrayBlock = textscan(fileID, formatSpec, endRow(block)-startRow(block)+1, 'Delimiter', delimiter, 'HeaderLines', startRow(block)-1, 'ReturnOnError', false);
for col=1:length(dataArray)
dataArray{col} = [dataArray{col};dataArrayBlock{col}];
end
end
fclose(fileID);
raw = repmat({''},length(dataArray{1}),length(dataArray)-1);
for col=1:length(dataArray)-1
raw(1:length(dataArray{col}),col) = dataArray{col};
end
numericData = NaN(size(dataArray{1},1),size(dataArray,2));
for col=[1,2,3]
rawData = dataArray{col};
for row=1:size(rawData, 1);
regexstr = '(?<prefix>.*?)(?<numbers>([-]*(\d+[\,]*)+[\.]{0,1}\d*[eEdD]{0,1}[-+]*\d*[i]{0,1})|([-]*(\d+[\,]*)*[\.]{1,1}\d+[eEdD]{0,1}[-+]*\d*[i]{0,1}))(?<suffix>.*)';
try
result = regexp(rawData{row}, regexstr, 'names');
numbers = result.numbers;
invalidThousandsSeparator = false;
if any(numbers==',');
thousandsRegExp = '^\d+?(\,\d{3})*\.{0,1}\d*$';
if isempty(regexp(thousandsRegExp, ',', 'once'));
numbers = NaN;
invalidThousandsSeparator = true;
end
end
if ~invalidThousandsSeparator;
numbers = textscan(strrep(numbers, ',', ''), '%f');
numericData(row, col) = numbers{1};
raw{row, col} = numbers{1};
end
catch me
end
end
end
filename = cell2mat(raw);
如何使用
>> importfile('file.txt',1,4)
ans =
1 2 3
2 4 5
2 2 2
8 3 3
答案 5 :(得分:0)
fid = fopen ("yourfile", "r");
x = str2num (char(fread(fid))');
fclose (fid)
(我不知道这是否适用于Matlab)