【发布时间】:2013-09-05 16:36:49
【问题描述】:
我有问题。
我有两个矩阵 nbd_new 和 nbd_old,它们存储像 phi_new 和 phi_old 这样的 2D 矩阵的线性索引号。 phi_old 和 phi_new 的大小相同。我需要做的是计算集合 nbd_new 中但不在集合 nbd_old 中的所有位置。然后对于每个这样的位置,我必须以这种方式更新 phi_new:如果该位置的 phi_old 大于 0,则将 phi_new 放在该位置 = width+1 否则将 phi_new 放在该位置 = -(width+1)
我写过这样的代码:
C = setdiff(nbd_new,nbd_old);
for k=1:length(C)
if phi_old(C(k))>0
phi_new(C(k))=(width+1);
else
phi_new(C(k))=-(width+1);
end
end
此代码可以运行,但由于循环和 if-then-else 语句而非常慢。这段代码可以进一步优化吗?
提前谢谢大家!!
编辑:请检查 phi_old 和 phi_new 是否都是二维矩阵,矩阵 C 是该矩阵的线性索引(位置)的集合。如果我事先不清楚,我很抱歉。错误地,我写了 u 而不是 phi。两者都是一样的。
【问题讨论】:
-
如果
u_new没有事先初始化,代码也可能会很慢。 -
请检查编辑 & u_new 或 phi_new 在这种情况下确实已初始化。
-
你实际上并没有使用 C 的值,只是它的长度。这是故意的吗?
-
@Peter 是的,这确实是故意的。 C 仅包含二维矩阵 phi_old 和 phi_new 的线性索引或位置,我将要比较和更改其值。我使用变量 k 将循环从 1 运行到 C 的长度。然后我使用 k 访问二维矩阵 phi_old 和 phi_new 的所需元素。明白了吗?
-
没有。如果 C 中有线性索引(假设为 [3 9 17]),则 k 从 1:3 开始迭代,并且您在 (1)、(2) 和 (3) 处引用 phi_new。如果忽略结果,setdiff 有什么用?
标签: matlab optimization image-processing vectorization