【问题标题】:storing values from a matrix to another one with an if operation using matlab使用matlab使用if操作将值从矩阵存储到另一个矩阵
【发布时间】:2016-02-20 20:23:51
【问题描述】:

我有一个“x1”矩阵,我想提取一些与逻辑条件相关的特定元素:

for z=1:length(x1)
  if (x1(z+1)-x1(z))>=20)
       extract=
  end
end

如何获得“提取”矩阵和这些值在 x1 中的索引?

【问题讨论】:

    标签: matlab if-statement for-loop


    【解决方案1】:

    x1 中元素的索引显然是z 本身:第 z 个元素满足该条件。在extract 我想你想输入x1(z),这就是价值。但是extract 的元素可能比x1 少,所以我们需要一个适当的索引来贯穿extract,我们称之为k

    k=1
    for z=1:length(x1)-1
      if (x1(z+1)-x1(z))>=20)
           extract(k)=x1(z); %if you want to extract the value
           k=k+1;
      end
    end
    

    或者,如果你想保存x1 的索引而不是值

    k=1
    for z=1:length(x1)-1
      if (x1(z+1)-x1(z))>=20)
           extract(k)=z;
           k=k+1;
      end
    end
    

    在此循环结束时,extract 将是一个数组,其中包含满足您条件的x1 中元素的所有值(第一个循环)或索引(第二个循环)。

    为了完整起见,要同时获得两者,我们必须使用两个数组(extract 用于值,indices 用于索引):

    k=1
    for z=1:length(x1)-1
      if (x1(z+1)-x1(z))>=20)
           extract(k)=x1(z); % store the value
           indices(k)=z;     % store the index
           k=k+1;
      end
    end
    

    【讨论】:

    • 代码不工作,因为索引将超过z=length(x1) 的矩阵维度。您可以通过定义extract=[] 并在循环中使用extract(end+1) 来删除k
    • 我很清楚这一点。虽然这对于初学者来说看起来像是一个简单的 Matlab 练习,其目标是学习如何处理基础知识(for 循环、条件、数组),我认为显式使用 k 是有效的。公平地说,绝对公平,也不需要循环。
    • 我可以将相同的逻辑应用于单元格吗?而不是“x1”,现在有“x1c”单元格,它被提取为:for j=1:200 x1c{j,1}=[FM{1,j}{1,2},FM{1,j}{1,3},FM{1,j}{1,4}]; end
    • 嗯,x1 看起来像一个向量。如果x1 是一个矩阵,则length() 不是收集其大小的更强大的函数。更好的选择是size()numel()。此外,矩阵应该使用 2 个索引(行和列)进行索引,但是您也可以使用一个索引来遍历它。如果x1 是一个向量,那么这种方法是完美的。如果x1是一个矩阵,你可以让这段代码更加健壮。
    • 是的@Matt,关于索引超出范围错误,您是绝对正确的。老实说,我没有运行它,我的 Matlab 目前正忙于并行计算。我已经更改了 for-loops 行。为指出这一点而欢呼。
    【解决方案2】:

    您可以使用此代码提取索引

    x1Diff = diff(x1)
    x1DiffTh = zeros(size(x1Diff))
    x1DiffTh[x1Diff>20] = 1
    indx = find(x1DiffTh)
    

    或压缩成 1 行

    indx = find(diff(x1)>20)
    

    Matlab 中的 For 循环效率很低,因为代码没有被编译。

    【讨论】:

    • 在这种情况下最好使用 false 进行预分配。
    • 为什么? find 查找非零元素。你可以放 42 而不是 1
    • 1:可以直接将x1Diff>20放在find的参数中。 2:如果不是,你肯定需要用括号()替换括号[]
    • 同意。你甚至可以写find(diff(x1)>20)。我根据提问者的水平调整了我的回答。
    • 对于 find 它是无关紧要的,但对于逻辑索引的大多数应用,它们必须是逻辑数据类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多