【问题标题】:loading files by criteria in MatLab在 MatLab 中按标准加载文件
【发布时间】:2019-10-18 00:54:30
【问题描述】:

我已经搜索了一些从分子数据库中加载 xyz 文件(带有数字的表格)的方法,但无法让代码按照我的意愿完美运行。

如果比较矩阵 =0 打开所有文件,如果它的大小为 1,1 但与 0 不同,则将所有文件与compare 中的文件进行比较,最后如果大小>1,1,则文件为指定并且有效。

文件也用数字命名,如果不重命名就可以打开它们就好了。

如果我记得我的 matlab 是 2016 年,我不经常编码,这就是为什么我会弄乱语法并想让它在长期比较时轻松工作。如果有人知道如何打开 xyz 文件的在线数据库,那就更好了。

cd input
compare=['a2';'s4'];
cd ..
NumMols=size(compare);
if compare = 0
  compare = dir;
  compare = compare(~[compare.isdir]);
  NumMols=size(compare);
else if size(compare)=(1,1)
  FileNrOne=compare
  compare = dir;
  compare = compare(~[compare.isdir]);
  compare = compare(~[FileNrOne]);
  NumMols=size(compare)+1;
end

for k=1:NumMols
  cd input
  mol = dlmread(compare(k),'\t');
  cd ..
end

编辑1: 我正在添加我使用的代码,因为一条评论要求我提供一些我已经运行和工作的代码。我还需要重命名文件,使文件名中没有数字。

cd input
compare=['a';'s'];
cd ..
NumMols=size(compare);
for k=1:NumMols
  cd input
  mol = dlmread(compare(k),'\t');
  cd ..
%some comparisons
end
%more comparisons

【问题讨论】:

  • if size(compare)=(1,1) 这是无效语法
  • 如果你要发布代码,至少要先运行它以确保它是正确的。生锈不是语法错误的借口。
  • @CrisLuengo 我已经添加了工作代码,我承认我没有测试像“=”这样的问题,但请告诉我在哪里可以找到其他问题的解决方案。工作代码对我来说已经足够好了,但其他人可能无法使用它,因为它的用途可能超出我的预期。使其更加自动化将鼓励其他人将其用于更好的事情。
  • 您能解释一下您希望compare=['a';'s'] 做什么以及您认为NumMols 的价值来自哪里吗?
  • @nekomatic compare 具有我将比较的分子的文件名,NumMols 是迭代需要遍历所有这些分子的文件数

标签: matlab


【解决方案1】:

据我了解,您的问题是您想要获取包含零个、一个或多个项目的文件名列表,并且您希望在每种情况下采取不同的操作。您要执行的操作之一是读取特定目录中的文件名,并将它们与原始列表中的文件名进行比较。

我在您的代码中看到的第一个问题是您将列表指定为字符数组:

compare=['a';'s'];

在比较时这可能会给您带来问题,因为每个文件名都会被空格填充以使其长度与最长的文件名相同。请改用字符串元胞数组。要检查此数组中有多少项,请使用length

接下来要获取目录的内容:

compare = dir;
compare = compare(~[compare.isdir]);

没关系,它会为您提供一个结构数组,其中包含所有文件的详细信息,但不包含目录的详细信息。但是这个

compare = compare(~[FileNrOne]);

是没有意义的,因为据我所知FileNrOne 应该是一个字符数组,而~['some character array'] 只是返回一个逻辑数组,该数组的长度是所有元素为假的字符数组的长度。如果你有一个来自dir 的结构数组——我们称之为dirResult——并且你想删除名称为removeMe 的元素,请执行以下操作:

dirResult = dirResult(~strcmpi(removeMe, {dir.name}));

如果您的文件系统不区分大小写(通常是 Windows、Mac),请使用 strcmpi;如果您的文件系统区分大小写 (Linux),请使用 strcmp

如果此答案无法解决您的问题,请更新您的问题,详细说明到底出了什么问题,或者提出一个新的更具体的问题。

【讨论】:

  • 谢谢,我会考虑这些的,因为我还没有
【解决方案2】:

因为我发现很难阅读其他问题的答案,所以我认为添加一个解释我所学知识的答案会很好。另外我可能学错了,有人可能会在这里纠正我。

首先需要compare 中的字符串元胞数组,以防给出文件并且iscell 检查该后缀。

compare = {'s444173xyz.txt','a2345345xyz.txt'}; %or compare =0;
NumMols = size(compare);
tf = iscell(compare);
if tf == 0
 if compare == 0
  compare = dir('input');
  compare = compare(~[compare.isdir]);
  NumMols=size(compare);
 end
else
 if tf == 1
  if NumMols == 1
   FileNrOne=compare
   compare = dir;
   compare = compare(~[compare.isdir]);
   compare = compare(~[FileNrOne]);
   NumMols=size(compare)+1;
  end
 end
end

for k=1:NumMols
  cd input
  if tf == 1
    mol = dlmread(char(compare(k)),'\t');
  else
    mol = dlmread(compare(k).name,'\t');
  end
  cd ..
end

我需要在compare = compare(~[FileNrOne]); 上工作,因为它会引发其他问题,比较真正有用的地方

【讨论】:

    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-06
    • 2015-05-15
    • 2011-09-26
    • 2015-10-22
    相关资源
    最近更新 更多