Matlab 4dplot (x,y,z,t)
Matlab 4dplot (x,y,z,t)
我正在尝试绘制包含 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]
- 等(一千多个数据点)
我正在考虑打开文本文件,创建一个循环来获取 x、y、z、t 并使用 scatter3 进行绘图。如果有人能让我开始了解 MATLAB 代码应该是什么样子,那就太好了。
我不是很明白你想如何在 4D 中绘图,但我猜你想在 3D 中绘图,然后随着时间的推移动态地改变绘图。
但是无论如何,关于文件:
首先,文字阅读非常简单。
你只需要创建一个变量,即file_text_rd
,然后使用这个变量打开文件:
file_text_rd = fopen('data.txt','r');
第一个参数为.txt
文件的名称(注意需要设置目录为.txt
文件所在的文件夹)。第二个参数声明您希望从文本文件中读取。
然后,您可以从文件中读取数据并将数据放入具有不同功能的变量中(取决于更适合您的)。例如,
var=fgetl(file_text_rd);
会将文件内容的第一行放入您的变量中。
var=fscanf(file_text_rd,%c);
会将.txt
文件的全部内容放入你的变量等,其他读取函数有fread
和fgets
。因此,根据功能的不同,您可能想使用一些循环函数来为 var
填充内容。
完成文件读取后,您需要关闭文件:
fclose(file_text_rd), clear file_text_rd;
下一部分可能有点棘手。这是将读取的字符转换为整数的部分。我为您编写了一些代码,以说明执行此操作的一种方法。在此解决方案中,我使用了 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 数据有所了解,尽管我无法真正理解那部分内容。
希望对您有所帮助,
博扬
我正在尝试绘制包含 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]
- 等(一千多个数据点)
我正在考虑打开文本文件,创建一个循环来获取 x、y、z、t 并使用 scatter3 进行绘图。如果有人能让我开始了解 MATLAB 代码应该是什么样子,那就太好了。
我不是很明白你想如何在 4D 中绘图,但我猜你想在 3D 中绘图,然后随着时间的推移动态地改变绘图。
但是无论如何,关于文件:
首先,文字阅读非常简单。
你只需要创建一个变量,即
file_text_rd
,然后使用这个变量打开文件:file_text_rd = fopen('data.txt','r');
第一个参数为
.txt
文件的名称(注意需要设置目录为.txt
文件所在的文件夹)。第二个参数声明您希望从文本文件中读取。然后,您可以从文件中读取数据并将数据放入具有不同功能的变量中(取决于更适合您的)。例如,
var=fgetl(file_text_rd);
会将文件内容的第一行放入您的变量中。
var=fscanf(file_text_rd,%c);
会将
.txt
文件的全部内容放入你的变量等,其他读取函数有fread
和fgets
。因此,根据功能的不同,您可能想使用一些循环函数来为var
填充内容。完成文件读取后,您需要关闭文件:
fclose(file_text_rd), clear file_text_rd;
下一部分可能有点棘手。这是将读取的字符转换为整数的部分。我为您编写了一些代码,以说明执行此操作的一种方法。在此解决方案中,我使用了 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 数据有所了解,尽管我无法真正理解那部分内容。
希望对您有所帮助, 博扬