1

x、y、z、t を含む何千ものデータ ポイントのグラフをプロットしようとしています。データは .txt ファイルにあり、次のようになります。

  • [x、y、z、時間]
  • [50.9160、12.2937、-44.9963、0.0]
  • [50.9160、12.2937、-44.9963、0.8]
  • [50.9160、12.2937、-44.9963、1.8]
  • [50.9160、12.2937、-44.9963、2.8]
  • [50.9160、12.2937、-44.9963、3.8]
  • [50.9160、12.2937、-44.9963、4.9]
  • [50.9160、12.2937、-44.9963、8.8]
  • [50.9160、12.2937、-44.9963、11.1]
  • [50.9160、12.2937、-44.9963、11.7]
  • [50.9160、12.2937、-44.9963、12.8]
  • [50.8989、12.3248、-45.0376、13.7]
  • [50.8989、12.3248、-45.0376、14.9]
  • [50.8989、12.3248、-45.0376、15.7]
  • [50.8989、12.3248、-45.0376、17.2]
  • [50.8989、12.3248、-45.0376、17.7]
  • etc(1000以上のデータポイント)

x、y、z、t を取得し、scatter3 を使用してプロットするループを作成して、テキスト ファイルを開く行に沿って考えています。MATLAB コードがどのように見えるべきかについて誰かが私を始めてくれたら、それは素晴らしいことです.

4

1 に答える 1

1

どのように 4D でプロットしたいのかよくわかりませんが、3D でプロットしてから、時間の経過とともにプロットを動的に変更したいと思っていると思います。

とにかく、ファイルについて:

まず、テキストの読み方は非常に簡単です。

  1. 変数を作成するだけです。つまりfile_text_rd、この変数を使用してファイルを開きます。

    file_text_rd = fopen('data.txt','r');

    最初のパラメーターはファイルの名前.txtです (ファイルが置かれているフォルダーにディレクトリを設定する必要があることに注意してください.txt)。2 番目のパラメーターは、テキスト ファイルから読み取ることを示します。

  2. 次に、ファイルから読み取り、データをさまざまな機能を持つ変数に入れることができます (どちらが適しているかによって異なります)。例えば、

    var=fgetl(file_text_rd);

    ファイルコンテンツの最初の行を変数に入れます。

    var=fscanf(file_text_rd,%c);

    ファイルの内容全体を.txt変数などに入れます。その他の読み取り関数はfreadfgetsです。そのため、関数によっては、ループ関数を使用varしてコンテンツを埋めたい場合があります。

  3. ファイルの読み取りが完了したら、次のようにファイルを閉じる必要があります。

    fclose(file_text_rd), clear file_text_rd;

次の部分は、おそらくもう少しトリッキーです。読み取った文字を整数に変換する部分です。これを行う 1 つの方法を説明するために、少しコードを書きました。このソリューションでは、fscanf関数を使用しました。

%Open file for reading
file_text_rd=fopen('data.txt','r');
%Read the content (%c means you are reading characters)
var=fscanf(file_text_rd,'%c');
%Converse the characters to double. Have in mind the ascii values of the
%chars, so you can get the actual number value of the numbers in the string
%by subtracting the 48 of the original value, since the zero in ascii is
%numbered as 48 (in decimal system).
conv_var=double(var)-48;
%Define the initial value of your variable (all zeros)
final_var=zeros(1,4);
%Row counter
count_r=1;
%Column counter
count_c=1;
%Divider
times=10;
%Dot flag
dot=0;
%Negative sign flag
negative_sign=0;
%This for loop is for testing every single character from the first to the
%last
for i=1:size(conv_var,2)-1    
    %This if condition is for:
    %1. Checking if the character is a number between 0 and 9
    %2. Checking if the character is a dot
    %3. Checking if the character is a minus sign
    %4. Checking if the character is a comma
    %All other characters are not of interest.
    if (conv_var(i)>=0 && conv_var(i) <=9) || conv_var(i) == -2 || conv_var(i) == -3 || conv_var(i) == -4 

        %If it's not a comma (that means we are still on the last number we
        %were working on) we go in this section
        if conv_var(i)~= -4
            %If it's not a minus sign we go in this section
            if conv_var(i) ~= -3
                %If the dot flag hasn't been set to 1 yet (no dot in the
                %string has yet been found) we don't enter this section
                if dot==1
                    %If the flag HAS been set, then the number just found
                    %on the sequence is divided by 10 and then added to the
                    %old versison, since if we are reading the number
                    %'50.9160', the 9 has to be divided by 10 and then
                    %added to 50
                    final_var(count_r,count_c)=final_var(count_r,count_c)+conv_var(i)/times;
                    %The divider now rizes because the next found number
                    %would be 10 times smaller than the one found just now.
                    %For example, in '50.9160', 1 is 10 times less than 9
                    times=times*10;
                else
                    %This condition is needed so we don't add the ascii
                    %number equivalent to the dot to the number we are
                    %working on.
                    if conv_var(i)~=-2
                        %We multiply the old version of the number we are
                        %working on, since if we are reading the number
                        %'50.9160', first we will read 5, then we will read 0,
                        %so we will need to multiply 5 by 10 and then add the 0
                        %and so on...
                        final_var(count_r,count_c)=final_var(count_r,count_c)*10+conv_var(i);
                    else
                        %If the character found IS the dot, then we just
                        %set the flag
                        dot=1;
                    end
                end
            else
                %If the character found IS the negative_sign, then we set
                %the flag for the negative_sign, so we can multiply the
                %number we are working on atm with -1.
                negative_sign=1;
            end            
        else
            %We get in this section if we found a comma character (or the
            %ascii equvalent of the comma sign, more accurately)
            if negative_sign==1
                %This is the part where we multiply the number by -1 if
                %we've found a minus sign before we found the comma
                final_var(count_r,count_c)=-final_var(count_r,count_c);
            end

            %Here we add 1 to the column counter, since we are ready to
            %work with the next number
            count_c=count_c+1;

            %We reset all the flags and the divider
            dot=0;
            times=10;
            negative_sign=0;
        end

    end

    %The number -38 in ascii is the equivalent of NL, or the end of the
    %line sign (which we can't see), which actually means there was an "Enter" pressed at this point
    if conv_var(i)==-38
        %We set the column counter to one since, we will work now with the
        %first number of the next four parameters
        count_c=1;

        %We increment the row counter so we can start saving the new values
        %in the second row of our matrix
        count_r=count_r+1;

        %We set the next row initially to be all-zeros
        final_var(count_r,:)=zeros(1,4);

        %We reset the flags
        dot=0;
        times=10;
        negative_sign=0;
    end
end

%We close the file, since our work is done (you can put this line after the
%fscanf if you like)
fclose(file_text_rd), clear file_text_rd;

4D データをプロットする方法についてはある程度理解できていると思いますが、私はその部分を完全に把握できていません。

お役に立てば幸いです、ボージャン

于 2015-10-06T08:18:25.023 に答える