python - 用于映射具有相等分布的两个向量的 MATLAB 代码
问题描述
我有一个我正在尝试移植到 MATLAB 的 python 代码。
该代码执行以下操作:
假设我有两个列表 A = [0,1,2,3,4] 和 B = [0,1,2]。它创建一个大小为 5x3 的关联矩阵 M,如果 A 和 B 之间存在关联,则其元素为 1,否则为 0。需要注意的是,A 必须在 B 之间平均分配(尽可能)。例如,B[0] 和 B[1] 可以与来自 A 的 2 个不同元素相关联,而 B[2] 与最后一个元素相关联。关联应该是随机的。此外,A 中的一个元素不能仅映射到 B 中的一个元素。
在python中,我通过
S = len(A)
V = len(B)
random.shuffle(A)
assoc = {v: A[v::V] for v in range(V)}
M = {(s, v): 1 if s in assoc[v] else 0 for s in range(S) for v in range(V)}
如何在 MATLAB 中实现这一点?我真的不需要中间关联。我感兴趣的是矩阵M。
解决方案
好的,我使用整数编程解决了它。事情就是这样。
令 x_ij 是一个二进制变量,表示从列表 A 到列表 B 的映射。因此,加载到列表 B 中的元素上的是 L_j = sum_i x_ij。令 z = max_j L_j。我们想尽量减少这种情况。
约束是列表 A 中的一个元素不能映射到列表 B 中的多个元素。因此,sum_j x_ij = 1。
这是在 MATLAB 中使用优化工具箱实现的:
assignprob = optimproblem;
x = optimvar('x', numel(A), numel(B), 'Type', 'integer', ...
'LowerBound', 0, 'UpperBound', 1);
z = optimvar('z', 'LowerBound', 0);
cons1 = sum(x, 2) == 1;
loads = sum(x, 1);
cons2 = z >= loads;
assignprob.Objective = z;
assignprob.Constraints.cons1 = cons1;
assignprob.Constraints.cons2 = cons2;
[sol, fval] = solve(assignprob);
我不知道这是否是最好的解决方案,但它确实有效。
推荐阅读
- android - Parcelable 接口
- javascript - 为什么我的 async/await 示例不起作用?
- three.js - 街道霓虹灯的发光效果
- reactjs - React 问题:“对象作为 React 子级无效。如果您要渲染一组子级,请改用数组。”
- asp.net-core - ASP.NET Core 自定义路由不适用于 web api 2.1
- xpath - 建立“目录”
- c# - Entity Framework 6 与 Entity Framework Core - 细微差别?
- jquery - 隐藏具有特定类的最接近的元素
- c# - Serilog Network.Sink json 输出格式
- java - 使用 Java Opencv 检测图像中的最大矩形 [已解决]