【发布时间】:2013-05-25 18:10:00
【问题描述】:
我正在研究一个函数,它以 n×1 数组(称为“ts”)作为输入并创建一个 n×n 矩阵(称为“V”),其中 V 的每个元素是0 或 1。
现在将“ts”想象成一个图:如果可以使用一条直线将任意点(例如 ts(5))与另一个任意点(例如 ts(47))连接起来而不与时间序列相交,那么矩阵元素 V(5,47) 和 V(47,5) 应为 1。如果两个点在不与时间序列相交的情况下无法连接,则矩阵中的相应元素应为 0。应该这样做"ts" 中所有可能的点对。
函数如下:它可以工作,但效率很低(尤其是因为三个嵌套循环)。有没有办法对这段代码进行矢量化?
function V = someFunction(ts)
len = length(ts);
V = zeros(len, len);
for a = 1:len,
for b = 1:len,
intersection = [];
for c = min(a,b)+1 : max(a,b)-1,
t_a = a;
y_a = ts(a);
t_b = b;
y_b = ts(b);
t_c = c;
y_c = ts(c);
if (y_c < y_b + (y_a - y_b) * ((t_b - t_c) / (t_b - t_a))),
intersection = [intersection; 0];
else
intersection = [intersection; 1];
end
end
if all(intersection==0),
V(a,b) = 1;
end
end
end
end
【问题讨论】:
-
你正在增长交叉点,你应该预先分配它。
-
@OlegKomarov - 可以完全删除。
标签: matlab loops for-loop vectorization