BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / matlab / #13406同步于 2022/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖

CVX和Matlab的向量化加速

cyanmango
2022/3/18镜像同步5 回复
更新: 如何消除任意层MATLAB for循环->https://ask.cvxr.com/t/how-to-vectorize-most-constraint-loops-in-cvx/9804?u=jackfsuia 以为大多数人都读懂了但好像并没有[捂脸][捂脸]补充了一些解释在下面。 ----- 经常用cvx和matlab做仿真的可以看看我写的http://ask.cvxr.com/t/how-to-vectorize-most-constraint-loops-in-cvx/9804,可能能节省大量仿真时间。
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
dhown机器人#1 · 2022/3/18
不知道我理解的是否正确 图1 % 随机生成数据 M = 100; N = 41; x = rand(N, 1); y = rand(M, 1); z = rand(N, 1); %% 你的代码是: F=(repmat((1:N)',1,M)~=permute(repmat((1:M)',1,N),[2 1])).*(repmat((1:N)',1,M).^3>permute(repmat((1:M)',1,N),[2 1]).^2); Eq1 = (repmat(x,1,M) - permute(repmat(y,1,N),[2 1]) - repmat(z,1,M)); output1 = F.*Eq1>=0; % 上述代码存在bug,因为F是满足条件为1,不满足为0.所以F取值只有两种。 % Eq1的取值正负零均可。 % F.*Eq1结果就是,当F=0对应的位置,Eq1全部为0,此时F.*Eq1>=0为真 % 这样会导致所有不满足条件的点,全部为真。 % 应该改为如下代码: output1_modify = F.*(Eq1>=0); % 假设x,y,z全是列向量,完全可以用 转置 即可 % repmat(x, 1, M) - repmat(y', N, 1) ... 来代替 % 不需要 permute 重排。 % 另外,可以使用meshgrid函数就能满足我们的要求 % x(n)>=y(m)+z(n); 本质是两个不同变量n和m遍历的向量比较,可以先将变量相同的移到等号一侧 % x(n)-z(n)>=y(m); 可以改写为 k(n) >= y(m) % 本质如图1所示 % 可以利用meshgrid(a{N*1}, b{M*1})生成 N列 M行的矩阵。然后比较 [K, Y] = meshgrid(x-z, y); Eq1 = (K>=Y); % 判断条件同理,就是横纵坐标n和m的关系 n~=m and n.^3>m.^2 [N, M] = meshgrid(1:N, 1:M); F2 = M~=N & N.^3>M.^2; out2 = F2.*Eq1; % 最后比较一下,两种方法一致 sum(sum(abs(output1_modify-out2')))
cyanmango机器人#2 · 2022/3/18
理解正确。但对一些代码建议不太赞同。 【 在 dhown 的大作中提到: 】 : 不知道我理解的是否正确 : ............
dhown机器人#3 · 2022/3/18
我可能理解错误了。我对cvx不太理解。 上述代码,我的自己写的逻辑有问题。 仅仅对permute(x, [2, 1])而言 其本质就是矩阵转置。 因为对于两个维度的矩阵而言,MATLAB原先是按列排序的 permute(x, [2,1])改为了按行排序,和转置操作一样。 permute(x, [2, 1]等价于 x' permute(repmat(Y,1,N),[2 1]) 等价于 repmat(Y,1,N)' 等价于 repmat(Y',N,1) 所以我想可以稍微简化一些你的代码。 repmat是有必要的,meshgrid的代码实现也是repmat,这个使用哪个就无所谓了。 【 在 cyanmango 的大作中提到: 】 : 理解正确。但对一些代码建议不太赞同。
cyanmango机器人#4 · 2022/3/18
permute可用于类似N乘M乘P乘C的数组。好几个下标的变量是很常见的。感兴趣可以参考这个例子http://ask.cvxr.com/t/how-can-i-express-these-constraints-in-cvx/9538,里面第三个约束,需要扩张到第三个维度【 在 dhown 的大作中提到: 】 : 我可能理解错误了。我对cvx不太理解。 : 上述代码,我的自己写的逻辑有问题。 : ............
dhown机器人#5 · 2022/3/18
感谢,我看看 【 在 cyanmango 的大作中提到: 】 : permute可用于类似N乘M乘P乘C的数组。好几个下标的变量是很常见的。感兴趣可以参考这个例子http://ask.cvxr.com/t/how-can-i-express-these-constraints-in-cvx/9538,里面第三个约束,需要扩张到第三个维度【 在 dhown 的大作中提到: 】