从matlab中的文本文件加载大矩阵

时间:2014-10-26 10:33:29

标签: matlab octave

我有一个文本文件,如:

[ 1, 2, 3; 
  2, 4, 5;
  2, 2, 2;
  8, 3, 3 ]

在Octave / Matlab中将此作为矩阵加载的最快方法是什么?我希望将其视为一个包含4行和3列的矩阵。

6 个答案:

答案 0 :(得分:1)

用鼠标在MATLAB(显示所有当前变量的区域)上的工作区拖动文本文件并将其放在那里。这将打开“导入”窗口:

Import window

为文件命名(我的当前为“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)

你可以在Octave中做到

fid = fopen ("yourfile", "r");
x = str2num (char(fread(fid))');
fclose (fid)

(我不知道这是否适用于Matlab)