Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 以文本文件中三列的形式保存数据_Matlab - Fatal编程技术网

Matlab 以文本文件中三列的形式保存数据

Matlab 以文本文件中三列的形式保存数据,matlab,Matlab,此函数从多个mat文件读取数据,并将其保存在多个txt文件中。但是数据(每个值)在一列中保存一个值,依此类推。我想在文本文件中以三列(坐标)的形式保存数据,因此每行有三个由空格分隔的值。在将数据保存到文本文件之前对其进行重塑是行不通的。我知道dlmwrite应该修改为在三个值之后换行,但是如何修改呢 mat = dir('*.mat'); for q = 1:length(mat) load(mat(q).name); [~, testName, ~] = fileparts(m

此函数从多个mat文件读取数据,并将其保存在多个txt文件中。但是数据(每个值)在一列中保存一个值,依此类推。我想在文本文件中以三列(坐标)的形式保存数据,因此每行有三个由空格分隔的值。在将数据保存到文本文件之前对其进行重塑是行不通的。我知道
dlmwrite
应该修改为在三个值之后换行,但是如何修改呢

mat = dir('*.mat'); 
for q = 1:length(mat) 
   load(mat(q).name);
   [~, testName, ~] = fileparts(mat(q).name);
   testVar = eval(testName); 
   pos(q,:,:) = testVar.Bodies.Positions(1,:,:);
   %pos=reshape(pos,2,3,2000);
   filename = sprintf('data%d.txt', q);
   dlmwrite(filename  , pos(q,:,:), 'delimiter','\t','newline','pc')
 end
我的数据结构:

这些数据应从每个mat文件中提取,并存储在相应的文本文件中,如下所示:


为什么不使用writematrix()函数

mat = dir('*.mat'); 
for q = 1:length(mat) 
   load(mat(q).name);
   [~, testName, ~] = fileparts(mat(q).name);
   testVar = eval(testName); 
   pos(q,:,:) = testVar(1,:,1:2000);
   filename = sprintf('data%d.txt', q);
   writematrix(pos(q,:,:),filename,'Delimiter','space');
 end
您可以在此处找到更多信息:
一位TheMathWorks培训师曾经告诉我,几乎没有什么好的理由或需要使用
eval
。下面是一段代码,它应该可以解决您的写作问题,因为它被认为是不推荐使用的

它进一步将文件处理/加载置于更具弹性的基础上。可以使用
(文件名)
符号动态访问结构。如果你知道你的领域,这是很方便的。一个人可以在工作区中列出变量,也可以在.mat文件中列出

看看:

%文件夹的路径
pFldr=pwd;
%获取所有mat文件的列表(返回结构数组)
Lst=dir(完整文件(pFldr,*.mat');
%循环文件
对于Fl=Lst
%创建文件的路径
pFl=完整文件(Fl.folder,Fl.name);
%要加载的变量
[~,var2load,~]=fileparts(Fl.name);
%获取文件中变量的名称
varInfo=who('-file',pFl);
%检查它是否包含所需的变量
if~all(ismember(var2load,varInfo))
%显示某种警告/信息
disp(strcat(“文件”,Fl.name,“不包含所有必需的变量包,因此被跳过”)
%跳过/继续循环
持续
结束
%加载|无需使用eval()
Dat=负载(pFl,var2load);
%做你想做的事
pos=挤压(数据(可变负载)(1,:,1:2000));
%为文本文件创建文件名
pFl2save=fullfile(Fl.folder,strep(Fl.name,'.mat','.txt');
writematrix(pos、pFl2save、“分隔符”、“t”)
结束

要将3D矩阵数据转换为2D矩阵,以便很好地写入文件,请使用函数。它去掉了空维度(在您的例子中是第一维度),并将数据压缩到低维矩阵中

谢谢,但它没有将数据保存在表单中(每行三列),因此可能我不理解您的数据结构。在存储数据结构之前,您是否尝试过重塑()来更改它?在我做了一些更改之后,您的代码可以正常工作。也许我可以修改你的解决方案,但我没有特权:)请添加评论,我会相应地更新:)我收到一条消息,我的评论(代码)太长:)嘿,谢谢你的回答。我想要的变量位于文件名(Filename.rigiidbodies.positions)中刚体的位置内,因此我将其写为pos=Dat.rigiidbodies.positions(var2load)(1,:,:);注释后pos出现错误(使用括号“()”进行索引必须显示为有效索引表达式的最后一个操作)(执行任何操作)请参见我的数据结构不要忘记括号前的点:
Dat.RigidBodies.Positions.(var2load)(1,:,:)。如果使用这种嵌套结构,将很难使用
who
。您的示例建议,
testName
也是您要加载和索引的变量的名称(对不起,我不会从未知来源下载数据)。在我与谁或其他人合作的情况下,我如何做到这一点?我的代码使用writematix或dlmwrite,但每个值都位于一列中。你不需要下载日期:),它只是一张图片:),我没有上传我的数据,因为它不是必需的。刚体的位置在所有文件中保持不变。文件名中的数字只会更改。图片不显示数据结构。如果它只是一个3D变量,您可以使用我向您展示的
who
。要将数据从3D矩阵格式化为2D矩阵,请使用其中的请参见和参考。如果可以避免使用
eval
,请参阅max的答案,避免使用它。与此相关的问题很多(由于JIT禁用、代码模糊、对整个计算机进行格式化的潜在危害等导致性能严重损失)。请通过显著更改问题来停止编辑问题。不是在否定现有答案时,而是在突然添加一种完全无关的语言时。顺便说一句,这会使你的问题对网站来说过于宽泛,因为下一步是什么,C#?JAVAPHP?请认真阅读,遵守其中列出的限制和规则。好的,我不会改变这个问题。我是Stackoverflow的新手:)
mat = dir('*.mat'); 
for q = 1:length(mat) 
   load(mat(q).name);
   [~, testName, ~] = fileparts(mat(q).name);
   testVar = eval(testName); 
   pos(q,:,:) = testVar(1,:,1:2000);
   filename = sprintf('data%d.txt', q);
   writematrix(pos(q,:,:),filename,'Delimiter','space');
 end