【问题标题】:How to get a certain output in Matlab without for loops?如何在没有 for 循环的情况下在 Matlab 中获得某个输出?
【发布时间】:2019-10-17 20:53:53
【问题描述】:

我有一个顶点列表,其中每一行对应一个 (x, y) 坐标。

例如,以下包括顶点 (0, 0)、(1, 0) 和 (0, 1)

 V = [0 0;
      1 0; 
      0 1];

我还有一个边列表,其中第一列指定起始顶点的行,第二列指定结束顶点的行。

例如,以下包括边 (0, 0) 到 (1, 0) 和 (0, 0) 到 (0, 1)

E = [1 2; % V(1) -> V(2) = (0, 0) -> (1, 0)
     1 3] % V(1) -> V(3) = (0, 0) -> (0, 1)

我需要从这两个列表中生成一个边缘列表及其实际坐标。也就是说,从VE,我需要

 edge1 = [0 0]; % = E(1, 1) = V(1)
 edge2 = [0 0]; % = E(2, 1) = V(1)
 edge3 = [1 0]; % = E(1, 2) = V(2)
 edge4 = [0 1]; % = E(2, 2) = V(3)

我知道如何使用 for 循环执行此操作,但我的主管说使用函数 find(x) 有一个更优化的解决方案,它返回数组中的非零索引。我看不出如何使用find 来做到这一点。有没有一种方法可以在不使用 for 循环但使用 find 函数的情况下完成此操作?

【问题讨论】:

  • edge1 不只是实际第一条边的第一个坐标,等等?这是故意的吗?

标签: matlab optimization


【解决方案1】:

据我所知,find 在运行时并不是真正推荐的,而且考虑到 JIT 和 MATLAB 对其进行改进的努力,for 循环并不像过去那么糟糕。 然而,不使用 for 循环(并且不使用 find)的一种可能解决方案是:

E = [1 2;
     1 3];
V = [0 0;
     1 0; 
     0 1];

Edges=V(E(:),:)

Edges =

 0     0
 0     0
 1     0
 0     1

所以输出不是一个不同变量/边的列表,而是一个按行保存所有变量/边的矩阵。

【讨论】:

  • 对于E 的表示,插入来自V 的实际坐标,可以使用reshape(V(E, :).', size(E, 1), 2 * size(V, 2))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多