【问题标题】:Loading files with names containing multiple variables (MATLAB)加载名称包含多个变量的文件 (MATLAB)
【发布时间】:2014-04-08 22:54:42
【问题描述】:

我正在尝试将大约 40 个文件加载到 MATLAB 中,除了 2 个变量部分之外,所有文件的名称和位置都相同。它们每个都包含 5000 个数据点,我想将它们组合成 1 个单个向量。 它们是 HDF5 文件,所以我还必须指定文件内部的路径,其名称中也包含这些变量。

加载这些文件之一的示例是

ROdata = double(h5read('directories\010340text2\010340text2.hdf5','/othertext2'));

这里,变量是 010340 和 2。所以一般形式类似于(x 和 y 的 n 项)

ROdata = double(h5read('directories\xtexty\xtexty.hdf5','/othertexty'));

x 和 y 我已经在一个数组中加载到 MATLAB。

从这一点来看,我很无知。我想 num2str 出现在某个地方,但我尝试了一些方法(例如在视频 http://blogs.mathworks.com/videos/2009/07/02/advanced-loading-files-using-their-names-for-variable-names/ 中),但这不起作用,因为变量部分在文本内部,而不是在末尾。

我当然可以手动完成,但是这 40 个来自大约 300 个系列,所以要写很多。

【问题讨论】:

  • 请包括两个变量如何变化(及其范围)的模式。
  • x 没有真正的模式。例如,它是 010307、010323、010340,甚至数字也会不时变化。他们指的是时间。 y 只是 0 到 24。
  • 我认为你应该看看使用通配符的dir 函数:filenames = dir('directories\*text*\*text*.hdf5');
  • 一些一般建议:首先创建所有字符串,然后再尝试加载它们。这种方式应该更容易尝试。
  • @Dan 我认为dir 命令不能接受文件夹名称中的通配符。

标签: string matlab numbers


【解决方案1】:

这样的事情怎么样:

ROdata = double(h5read( ... 
  sprintf( 'directories/%06dtext%d/%06dtext%d.hdf5', 010340, 2, 010340, 2 ), ...
  sprintf( '/othertext%d', 2 ) ));

%# or more general:
x = 010340;
y = 2;
ROdata = double(h5read( ...
  sprintf( 'directories/%06dtext%d/%06dtext%d.hdf5', x, y, x, y ), ...
  sprintf( '/othertext%d', y ) ));

%# or even more general:
%# assume X is your array containing elements x, Y for y elements

ROdata = cell{ numel(X), 1 };
for ii=1:numel(X)
  ROdata{ii} = double(h5read( ...
    sprintf( 'directories/%06dtext%d/%06dtext%d.hdf5', X(ii), Y(ii), X(ii), Y(ii) ), ...
    sprintf( '/othertext%d', Y(ii) ) ));
end

看看sprintf函数,它很简洁。

为了使它起作用,您需要使用正斜杠,因为反斜杠充当转义字符。另一种可能性是使用'\\',但'/' 更具可读性并且也可以工作。

由于X 中的数字可能包含前导零:%06d 添加零填充,这样插入的数字将始终为 6 位长。

【讨论】:

  • 嗯,我已经尝试了几次以确保我没有在某个地方搞砸,但是我在使用 fclose 时遇到错误 无效的文件标识符。使用 fopen 生成有效的文件标识符。 h5read 中的错误(第 58 行) fclose(fid);
  • 好的,我发现了两个问题:1. 您需要使用正斜杠 2. 您需要注意零填充(例如在 010340 中)。这些值的长度是否始终相同?
  • 啊,你是对的。我正要发布出了什么问题,但目录名称中的正斜杠修复了它。在那之后它仍然会出错,因为你对 0 填充是正确的。这些值总是相同的长度,6 个数字,但它们并不总是以 0 开头。但它们中的大多数都这样做,所以如果很难同时满足这两种情况,那就坚持以 0 开头的那些!跨度>
  • 酷!不,你其实可以很好地解决这个问题,让我找到正确的填充函数,我会相应地更新答案!
  • %06d 添加零填充,这样插入的数字将始终为 6 位数。
【解决方案2】:

如何使用字符串连接?

ROdata = double(h5read(['directories\xtexty\' num2str(x) 'xtexty.hdf5'],['/othertexty' num2str(y)]));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2020-08-03
    相关资源
    最近更新 更多