2

データを行列にロードする matlab 関数を作成しようとしています。問題は、データの各行にもう 1 つの値があることです。残念ながらloadが使えないので、fgetlを使ってみます。

データは次のようになります。

143234 
454323 354654
543223 343223 325465

私がしたことは、ゼロの行列を作成することです。次元は高さとデータの最長の文字列です。データを行列に入れるために、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});

私が気になるのは、対話型コンソールで、ループで行われるのと同じことを試してみると、つまり、行をインポートし、textscan を使用してセル配列に分割し、num2str を使用して整数に変換することです。すべてが機能します。したがって、num2str の使用方法が間違っているか、for ループがおかしいことを行っているかのいずれかです。

私はちょうどアイデアを望んでいました.たくさんのデータがあるので、ロードを機能させるためにゼロを追加することはできません.

読んでくれてありがとう!

4

2 に答える 2

5

load または fgetl の代わりに dlmread を使用できます。行が最長ほど長くない場合は常に、ゼロを含む行列が自動的に返されます。やるだけ

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 に答える