2

我正在尝试编写一个将数据加载到矩阵中的 matlab 函数。问题是数据每行多一个值。所以不幸的是我不能使用负载,所以我正在尝试使用 fgetl。

数据如下:

143234 
454323 354654
543223 343223 325465

ETC

我所做的是创建一个零矩阵,维度是高度和最长的数据串。要将数据放入矩阵中,我使用 fgetl 读取每一行,然后使用 textscan 在空白处拆分数据。然后我使用 str2num (我认为这是错误所在)将字符串转换为数字。

首先继承我的代码:

%READTRI Opens the triangle dat file and turns it into a matrix

fid = fopen('triangledata.dat');

%create matrix of zeros for the data to be retrieved
trimat = zeros(15,15);

%Check to see if the file loaded properly
if fid == -1
disp('File load error')
else
%if it does, continue

%read each line of data into a
while feof(fid) == 0

    %run through line by line
    aline = fgetl(fid);

    %split aline into parts by whitespace
    splitstr = textscan(aline,'%s','delimiter',' ');

    %This determines what row of the matrix the for loop writes to
    rowCount = 1;

    %run through cell array to get the numbers out and write them to
    %the matrix
    for i = 1:length(splitstr)

        %convert to number
        num = str2num(splitstr{i});

        %write num to matrix
        trimat(rowCount, i) = num;

    end

    %iterate rowCount
    rowCount = rowCount + 1;
end
%close the file
closeresult = fclose(fid);

%check for errors
if closeresult == 0
    disp('File close successful')
else
    disp('File close not successful')
end
end



end

我得到的错误是:

Error using str2num (line 33)
Requires string or character array input.

Error in readTri (line 32)
        num = str2num(splitstr{i});

困扰我的是,当我尝试时,在交互式控制台中执行与循环中相同的操作,即导入 aline,使用 textscan 将其拆分为单元数组,然后使用 num2str 将其转换为整数。一切正常。所以要么我使用 num2str 的方式是错误的,要么 for 循环正在做一些时髦的事情。

我只是希望有想法,有很多数据,所以添加零来使负载工作是不可能的。

谢谢阅读!

4

2 回答 2

5

您可以使用 dlmread 代替 load 或 fgetl 每当行不长时,它会自动返回一个零矩阵。做就是了

matrix = dlmread('triangledata.dat');
于 2013-10-05T22:14:03.850 回答
2

为什么不使用textscan

fid = fopen('test.txt','r');
C = textscan(fid, '%f%f%f');
fclose(fid);

res = cell2mat(C)

结果是

res =

  143234         NaN         NaN
  454323      354654         NaN
  543223      343223      325465

缺失值在哪里NaN

于 2013-10-05T22:09:55.517 回答