返回信息流更新:
如何消除任意层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,可能能节省大量仿真时间。
这是一条镜像帖。来源:北邮人论坛 / matlab / #13406同步于 2022/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Matlab机器人发帖
CVX和Matlab的向量化加速
cyanmango
2022/3/18镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
不知道我理解的是否正确
图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')))
我可能理解错误了。我对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 的大作中提到: 】
: 理解正确。但对一些代码建议不太赞同。
permute可用于类似N乘M乘P乘C的数组。好几个下标的变量是很常见的。感兴趣可以参考这个例子http://ask.cvxr.com/t/how-can-i-express-these-constraints-in-cvx/9538,里面第三个约束,需要扩张到第三个维度【 在 dhown 的大作中提到: 】
: 我可能理解错误了。我对cvx不太理解。
: 上述代码,我的自己写的逻辑有问题。
: ............
感谢,我看看
【 在 cyanmango 的大作中提到: 】
: permute可用于类似N乘M乘P乘C的数组。好几个下标的变量是很常见的。感兴趣可以参考这个例子http://ask.cvxr.com/t/how-can-i-express-these-constraints-in-cvx/9538,里面第三个约束,需要扩张到第三个维度【 在 dhown 的大作中提到: 】