【问题标题】:Save the data in a form of three columns in text files将数据以三列的形式保存在文本文件中
【发布时间】:2020-11-25 18:23:54
【问题描述】:

该函数从多个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 文件中提取出来并存储在相应的文本文件中,如下所示:

332.68    42.76   42.663  3.0737  
332.69    42.746  42.655  3.0739  
332.69    42.75   42.665  3.074 

【问题讨论】:

  • 请参阅this answer of mine 和其中的参考资料。如果可以避免使用 eval,请参阅 max' 答案,避免使用它。有很多与之相关的问题(由于 JIT 禁用、代码模糊、格式化整个计算机的潜在危害等导致的极端性能损失)。
  • 请停止编辑您的问题,大幅更改它们。不是在使现有答案无效时,也不是突然添加一种完全不相关的语言。顺便说一句,这会使您的问题对于网站来说过于宽泛,因为接下来会是什么,C#?爪哇? php?请使用tour,阅读How to Ask,并遵守其中列出的限制和规则。
  • 好吧,我不会改变这个问题。我是 Stackoverflow 的新手 :)

标签: matlab


【解决方案1】:

一位 TheMathWorks 培训师曾经告诉我,几乎没有充分的理由也不需要使用 eval。这是一段代码,应该可以使用 writematrix 解决您的写作问题,因为 dlmwrite 被认为已被弃用。

它进一步将文件处理/加载置于更具弹性的基础上。可以使用.(FILENAME) 表示法动态访问结构。如果您了解您的领域,这将非常方便。使用 who 可以在工作区中列出变量,也可以在 .mat 文件中列出变量!

看看:

% path to folder
pFldr = pwd;

% get a list of all mat-files (returns an array of structs)
Lst = dir( fullfile(pFldr,'*.mat') );

% loop over files
for Fl = Lst.'
    % create path to file
    pFl = fullfile( Fl.folder, Fl.name );
    % variable to load 
    [~, var2load, ~] = fileparts(Fl.name);
    
    % get names of variables inside the file
    varInfo = who('-file',pFl);
    % check if it contains the desired variables
    if ~all( ismember(var2load,varInfo) )
        % display some kind of warning/info
        disp(strcat("the file ",Fl.name," does not contain all required varibales and is therefore skipped."))
        % skip / continue with loop
        continue
    end
    % load | NO NEED TO USE eval()
    Dat = load(pFl, var2load);
    
    % DO WHATEVER YOU WANT TO DO
    pos = squeeze( Dat.(var2load)(1,:,1:2000) );
    
    % create file name for text file
    pFl2save = fullfile( Fl.folder, strrep(Fl.name,'.mat','.txt') );
    writematrix(pos,pFl2save,'Delimiter','\t')
end

要将您的 3D 矩阵数据转换为可以很好地写入文件的 2D 矩阵,请使用函数 squeeze。它摆脱了空维度(在您的情况下是第一个维度)并将数据压缩到一个低维矩阵中

【讨论】:

  • 您好,谢谢您的回答。我想要的变量在文件名(Filename.RigidBodies.Positions)内的刚体中的位置内,所以我将其写为 pos = Dat.RigidBodies.Positions(var2load)(1,:,:);我在注释后的 pos 处出现错误(带括号'()' 的索引必须作为有效索引表达式的最后一个操作出现)(做任何你想做的事)
  • 请看我的数据结构
  • 不要忘记括号前的点:Dat.RigidBodies.Positions.(var2load)(1,:,:);。如果使用这样的嵌套结构,将很难使用who。您的示例建议testName 也是您要加载和索引的变量的名称(对不起,我不会从未知来源下载数据)
  • 在我与谁或其他人的情况下,我该如何做?我的代码适用于 writematix 或 dlmwrite,但每个值都位于一列中。您不需要下载日期:),它只是一张图片:),我没有上传我的数据,因为它没有必要。 RigidBodys.Positions 在所有文件中保持不变。文件名中的数字只是变化。
  • 图片没有显示数据结构。如果它只是一个 3D 变量,您可以使用我向您展示的 who。要将数据从 3D 矩阵格式化为 2D 矩阵,请使用 squeeze
【解决方案2】:

为什么不使用 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

您可以在此处找到更多见解: https://www.mathworks.com/help/matlab/ref/writematrix.html

【讨论】:

  • 谢谢,但它不会将数据保存在表单中(每行三列)
  • 所以也许我不明白你的数据构造。您是否尝试过 reshape() 在存储之前更改数据结构?
  • 您的代码在我做了一些更改后工作。也许我可以修改你的解决方案,但我没有权限:)
  • 请添加评论,然后我会相应地更新它:)
  • 我收到一条消息说我的评论(代码)太长:)
猜你喜欢
  • 1970-01-01
  • 2022-09-24
  • 2012-01-15
  • 2014-10-22
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多