【问题标题】:Create a loop using part of variable name in MATLAB在 MATLAB 中使用部分变量名创建循环
【发布时间】:2014-09-01 08:40:23
【问题描述】:

我是 Matlab 的初学者,到目前为止还没有找到我的问题的答案。您的帮助肯定会非常感激。

我有 70 个矩阵 (100x100),命名为 SUBJ_1、SUBJ_2 等。我想创建一个循环,以便为每个矩阵计算一些指标(即最大值和最小值),并将输出保存为 70x2 结果矩阵(其中每一行对应于连续命名的 SUBJ_ 矩阵)。

我在两个阶段都在苦苦挣扎 - 如何在“for”循环中使用单个变量的名称以及如何将单个输出正确保存在组合数组中。

非常感谢,一切顺利!

【问题讨论】:

  • See related answereval(sprintf(...)) 是您想要的代码/解决方法/hack,但请注意开头的警告(类似于 DanielJonas 提到的内容)。

标签: matlab loops


【解决方案1】:

不要使用这样的变量名,创建一个名为SUBJ 的大元胞数组并将每个矩阵放入其中。

r=zeros(numel(SUBJ),2)
for idx=1:numel(SUBJ)
   r(idx,1)=min(min(SUBJ{idx}))
   r(idx,2)=max(max(SUBJ{idx}))
end

minmax 被调用两次,因为第一次调用在行之间创建最大值,第二次调用在列之间创建。

【讨论】:

  • 包含矩阵的单元格数组也可以,但我希望它比我在我的解决方案中给出的 3d 矩阵慢。它的优点是所有 70 个矩阵的大小不必相同。
【解决方案2】:

尽管这在 Matlab 中原则上是可行的,但我不推荐它:太慢且难以实现。

您可以改为使用 3-D 矩阵 (100x100x70) SUBJ,它将在一个矩阵中包含所有 SUBJ_1 等。这将允许您只用一行代码计算最小值/最大值等。 Matlab 将在内部处理循环:

OUTPUT(:,1) = min(min(SUBJ,[],1)[],2);
OUTPUT(:,2) = max(max(SUBJ,[],1)[],2);

像这样,OUTPUT(1,1) 包含min(min(SUBJ(:,:,1))) 等等...

【讨论】:

  • 大矩阵比元胞数组还要好,但您的代码不正确。 ALLMINS = min(min(SUBJ,[],1)[],2); 会产生正确的结果。
  • @Daniel,谢谢你 - 没有打开 MATLAB 并且太久了,因为我经常使用它:-/
  • 大家好!非常感谢您的建议。虽然这对于这个特定的(第一个)任务是实用的,但对于我的数据处理的后期阶段,我仍然需要以某种方式创建一个循环,通过对应于各个主题的数组。我需要运行之前准备好的脚本,数组需要保持其原始大小。因此,是否仍然可以通过基于主题名称的单个数组创建循环?谢谢!
  • 要遍历单个主题,您只需遍历 SUBJ(:,:,ii) 中的索引 iiSUBJ(:,:,1)SUBJ_1(:,:)相同;唯一的区别是符号。优点是在 Matlab 中增加 SUBJ(:,:,1) 的索引是微不足道的,而增加 SUBJ1(:,:) 的变量名是困难和丑陋的。
【解决方案3】:

至于如何在'for'循环中使用各个变量的名称,这里举个例子:

SUBJ = [];
for idx = 1:70
    term = eval(['SUBJ_',num2str(idx)]);
    SUBJ = [SUBJ; max(max(term)),min(min(term))];
end

【讨论】:

  • 这是@rochned 实际要求的,但正如其他 cmets 中提到的那样,它并不是真正推荐的,例如出于速度原因。每当您想使用eval 时,可能有一种更有效的方式来做事......
  • 是的,我承认这一点,尤其是当您需要处理大量数据时。
  • 谢谢,@Highman - 这正是我所需要的!对于当前的数据集(和其他脚本),这似乎工作得很好。也非常感谢其他人的建议和解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2019-11-28
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多