查找多个变量的所有组合总和为 1

2024-01-04

我正在尝试解方程

x1 + x2 + x3 + .... + xn = 1

其中所有的值xi仅限于[0, 0.1, 0.2, ..., 0.9, 1].


目前,我通过首先生成一个n维数组来解决问题mat,其中每个元素位置的值是轴值的总和,其变化范围为axisValues = 0:0.1:1:

mat(i,j,k,...,q) = axisValues(i) + axisValues(j) + ... + axisValues(q).

然后我搜索结果数组中所有等于 1 的条目。该代码(如下所示以进一步说明)运行良好,并且已针对最多 5 个维度进行了测试。问题是,运行时间呈指数增长,我需要脚本在多个维度上工作。

clear all
dim = 2; % The dimension of the matrix is defined here. The script has been tested for dim ≤ 5
fractiles(:,1) = [0:0.1:1]; % Produces a vector containing the initial axis elements, which will be used to calculate the matrix elements
fractiles = repmat(fractiles,1,dim); % multiplies the vector to supply dim rows with the axis elements 0:0.1:1. These elements will be changed later, but the symmetry will remain the same.
dim_len = repmat(size(fractiles,1),1,size(fractiles,2)); % Here, the length of the dimensions is checked, which his needed to initialize the matrix mat, which will be filled with the axis element sums
mat = zeros(dim_len); % Here the matrix mat is initialized
Sub=cell(1,dim);
mat_size = size(mat);
% The following for loop fills each matrix elements of the dim dimensional matrix mat with the sum of the corresponding dim axis elements.
for ind=1:numel(mat)
    [Sub{:}]=ind2sub(mat_size,ind);
    SubMatrix=cell2mat(Sub);
    sum_indices = 0;
    for j = 1:dim
        sum_indices = sum_indices+fractiles(SubMatrix(j),j);
    end
    mat(ind) = sum_indices;
end
Ind_ones = find(mat==1); % Finally, the matrix elements equal to one are found.

我感觉以下使用问题对称性的想法可能有助于显着减少计算时间:

对于二维矩阵,满足上述条件的所有条目都位于对角线上mat(1,11) to mat(11,1),即从最大值x1到最大值x2.

对于 3D 矩阵,所有条目都满足位于对角平面上的条件mat(1,1,11), mat(1,11,1), mat(11,1,1),即从最大值x1 and x2到最大值x3.

对于更高维度也是如此:所有感兴趣的矩阵元素都位于n-1维度超平面固定在每个维度的最高轴值上。


问题是:有没有办法直接确定这些元素的索引?n-1维度超平面?如果是这样,整个问题就可以一步解决,而不需要计算 n 维矩阵的所有条目,然后搜索感兴趣的条目。


Math:

我们不采用超立方体的方式,而是求解方程

x(1) + x(2) + ... + x(n) = 1

其中每个x(i)可以变化[0, 1/k, 2/k, ... (k-1)/k, 1]反而。在你的情况下k将为 10,因为这将得出百分比[0, 10, 20, ... 90, 100]。 乘以k这对应于丢番图方程

x(1) + x(2) + ... + x(n) = k,

哪里所有的x(i)各有不同[0, 1, 2, ... k-1, k].

我们可以在它和组合概念之间建立双射与重复的组合 http://en.wikipedia.org/wiki/Combination#Number_of_combinations_with_repetition.

维基百科文章甚至含蓄地提到了该语句的潜在双射:

大小为 k 的多重子集的数量就是丢番图方程的非负整数解的数量x1 + x2 + ... + xn = k.

对于一个较小的例子,假设我们要使用k=3和百分比[0, 33, 66, 100]反而。给定集合的所有 k 多重组合{1,2,3}:

RepCombs = 
     1     1     1
     1     1     2
     1     1     3
     1     2     2
     1     2     3
     1     3     3
     2     2     2
     2     2     3
     2     3     3
     3     3     3

然后我们使用以下规则将这些映射到您的百分比: 对于每一行i,如果输入的是j, 然后加1/3对应矩阵条目的百分比M(i,j)。第一行将对应于[1/3 + 1/3 + 1/3, 0, 0] = [1,0,0]。 此过程生成的总体矩阵如下所示:

M =
    1.0000         0         0
    0.6667    0.3333         0
    0.6667         0    0.3333
    0.3333    0.6667         0
    0.3333    0.3333    0.3333
    0.3333         0    0.6667
         0    1.0000         0
         0    0.6667    0.3333
         0    0.3333    0.6667
         0         0    1.0000

Code:

现在我们来看看生成这一切的 MATLAB 代码: 我使用该功能nmultichoosek from 这个答案 https://stackoverflow.com/a/28284672/3139711 and accumarray实现我们的目标:

function M = possibleMixturesOfNSubstances(N, percentageSteps)
RepCombs = nmultichoosek(1:N, percentageSteps);
numCombs = size(RepCombs,1);
M = accumarray([repmat((1:numCombs).', percentageSteps, 1), RepCombs(:)], 1/percentageSteps, [numCombs, N]);

如果你想要百分比[0, 10, ... 90, 100]并且有 4 种物质,使用以下命令调用此函数possibleMixturesOfNSubstances(4,10)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找多个变量的所有组合总和为 1 的相关文章

  • 列出所有 k 元组,其条目总和为 n,忽略旋转

    有没有一种有效的算法来查找所有序列k总和为的非负整数n 同时避免旋转 如果可能的话 完全避免 顺序很重要 但对于我正在解决的问题来说 轮换是多余的 例如 与k 3 和n 3 我想要得到一个如下所示的列表 3 0 0 2 1 0 2 0 1
  • 通过消除嵌套的 for 循环来改进此代码

    R 包corrplot除其他内容外 还包含这个漂亮的功能 cor mtest lt function mat conf level 0 95 mat lt as matrix mat n lt ncol mat p mat lt lowCI
  • 轴标注问题

    通过运行我编写的以下 matlab 函数 可以互换图中的 x 轴和 y 轴 谁能告诉我问题出在哪里或者帮我解决它吗 预先感谢您的任何帮助 function axislabeling n x 1 1 n y 1 1 n z zeros n n
  • 如何从 matlab 调用 Qtproject?

    我在 matlab 中有一个函数可以写入一个 file txt 我在 qt 项目中使用它 So 当我使用 unix 获取要运行的 qt 编译可执行文件时 我有一个 Matlab 文件 但出现错误 代码 unix home matt Desk
  • Mathworks 生成 Matlab HTML 文档的方法是什么?

    我正在开发共享的 Matlab 代码 我们希望在本地网络中将生成的文档作为可搜索的 HTML 文档共享 我知道以下生成文档的方法 编写一个类似于 C 文件的转换器 这是在中完成的将 Doxygen 与 Matlab 结合使用 http ww
  • 在 R 中,如何获得某些向量值的所有可能组合?

    背景 我有一个需要一些参数的函数 我想要获得所有可能的参数组合的函数结果 一个简化的例子 f lt function x y return paste x y sep colors c red green blue days c Monda
  • 在 Pari-GP 中嵌套特定递归

    每个人 我最初在 Stackexchange 上发布了类似的问题 它已移至此处 可以在链接中找到 在 Matlab 中声明函数递归序列 https stackoverflow com questions 67146061 declaring
  • MATLAB问题:在图块中引用变量的值[重复]

    这个问题在这里已经有答案了 可能的重复 matlab 绘图标题中的变量 https stackoverflow com questions 5629458 matlab variable in plot title 我想在图中引用 m 文件
  • MATLAB 中的逻辑数组与数值数组

    我正在比较两个二进制数组 我有一个数组 其中值可以是一或零 如果值相同则为 1 如果不同则为零 请注意 我正在做检查之外的其他事情 因此我们不需要进入矢量化或代码的性质 在 MATLAB 中使用数值数组和逻辑数组哪个更有效 Logical
  • 在 Python 上显示 Matlab mat 文件中的图像

    我目前正在尝试显示从此下载的 Mat 文件中的图像site http www rctn org bruno sparsenet 这是一个 mat 文件 所以我尝试使用 scipy io loadmat 函数加载它 但我似乎无法绘制图像 我究
  • 计算给出数组中最小标准差的子集

    让我们有一个大小的向量N 例如 x rand N 1 我想计算长度子集的最小标准差K在向量中 When N and K很小 很容易找到最好的子集 因为我可以使用nchoosek N K 枚举所有可能的子集 但是当值N and K比我们说的要
  • 获取数组中从右上角到左下角的所有对角线

    我试图存储矩阵中从右上角到左下角的所有对角线 并将它们存储在一个数组中 matrix array 2 0 0 2 3 0 0 3 3 0 0 2 0 0 0 0 预期产出 2 0 3 0 0 2 2 0 0 0 3 0 0 3 0 0 我试
  • Matlab 中的 3D 堆叠条形图

    我想在一个图中绘制多个堆叠条形图 detached 条形图 例如 准确地想象一下bar http mathworks com help matlab ref bar3 detached png绘图 但堆叠在一起 而不是单一颜色 Set up
  • 用于读取csv写入数组的c++程序;然后操作并打印到文本文件中(已经用 matlab 编写)

    我想知道是否有人可以帮助我 我正在尝试构建一个程序 从 csv 文件中读取大小未知的浮点数大数据块 我已经在 MATLAB 中编写了此代码 但想要编译和分发此代码 因此转向 C 我只是在学习并尝试阅读本文以开始 7 5 19892 4 23
  • 使用网络计算机进行 Matlab 并行处理

    我熟悉matlabpool and parfor用法 但我仍然需要加快计算速度 我的 1GB 网络中有一台功能更强大的计算机 两台计算机都有 R2010b 并且具有相同的代码和路径 使用两台计算机进行并行计算的最简单方法是什么 我今天使用的
  • MATLAB 问题中的 Parfor

    为什么我不能使用parfor在这段代码中 parfor i 1 r for j 1 N r xr j N r i 1 x i r j 1 end end 这是错误 错误 parfor 中的变量 xr 无法分类 请参阅 MATLAB 中的并行
  • 仅使用 numpy 和 pandas 计算转换矩阵中每个单词的频率

    我正在尝试仅使用 numpy 和 pandas 来计算转换矩阵中每个单词的频率 我有一根绳子 star wars darth leia luke han chewbacca luke chewbacca obi chewbacca luke
  • 2D 矩阵上的 Numpy where()

    我有一个像这样的矩阵 t np array 1 2 3 foo 2 3 4 bar 5 6 7 hello 8 9 1 bar 我想获取行包含字符串 bar 的索引 在一维数组中 rows np where t bar 应该给我索引 0 3
  • Matlab的uicontrol在Octave中的实现?

    我正在尝试在 Octave 中运行我们实验室中使用的图形程序的 m Matlab 代码 Octave 告诉我代码中使用的函数 uicontrol 没有定义 经过一番搜索 我发现 JHandles 包有一个 uicontrol GUI 功能的
  • python中的张量点运算

    我有两个数组A 1 2 3 and B 1 0 1 0 问题是如何在 python 中执行张量点积 我期待得到 C 1 2 3 0 0 0 1 2 3 0 0 0 函数 np tensordot 返回有关数组形状的错误 对这个问题稍微补充一

随机推荐

  • C++ 中的斐波那契数列

    include
  • 将一个表中的多个列连接到另一个表中的单个列

    我正在创建一个从两个表 Schedule 和 Reference 中提取数据的视图 Schedule 有 50 多列 它几乎完全非规范化 不是我的设计 其中大部分包含可以连接到参考表中的列的值 如何编写 SQL 语句以将 Schedules
  • 无法使用 C# 连接到启用 OnVif 的相机

    我是第一次使用 IPCam 并尝试连接到 OnVif 摄像机 我查看了各种论坛和堆栈溢出 并提出了以下代码 我知道该代码没有做任何有用的事情 但它现在只是一个概念证明 它找到我网络上的所有 4 个摄像头 然后我手动连接到其中一个摄像头以拉回
  • Java,如何找出哪个类或方法使用了大量内存?

    这是我的 Java 项目的一日内存曲线 如何找出哪个类或方法使用了大量内存 你需要一个可以做到的工具JVM 分配分析 https www google com search q jvm 20allocation 20profiling Ja
  • 获取 NEF 格式图像的拍摄日期

    我有一个函数可以获取 JPEG 格式图片的拍摄日期值 我遇到了 NEF Nikon raw 格式的问题 在 Windows 8 中 如果我将该列添加到 Windows 资源管理器详细信息视图 我可以看到 拍摄日期 值 执行以下命令时收到的错
  • 在实体框架中执行存储过程,返回List或DataSet

    如何修改以下方法以返回 List 或 DataSet 我想让它变得通用 这样它就可以从数据库返回多个结果集 public static DataTable ExecuteStoredProcedure ObjectContext db st
  • 使用 Mockito 设置 Firebase 用户身份验证的单元测试

    我一直在尝试为我的 Firebase 用户身份验证类设置单元测试 我尝试像许多教程所示的那样进行操作 但由于 firebase 核心插件已更新 因此它们改变了您必须设置环境的方式 我无法弄清楚如何使用 Mocks 调用 Firebase i
  • 增加 max_post_size 和 upload_max_filesize 有哪些注意事项?

    我想增加服务器上的 max post size 和 upload max filesize 以便我的应用程序能够处理更大的文件 大至 2GB 但在我这样做之前 有哪些注意事项 显然 PHP 开发人员将大小设置得较低是有原因的 操作需要一定量
  • MapStruct嵌套对象,仅当源元素不为null时创建目标对象

    我想映射嵌套的java对象 Customer address houseNumber to userDTO homeDTO addressDTO houseNo 期待 当且仅当Customer address houseNumber不为空
  • 在 Hibernate 中是否有比执行 select 和 count 查询更有效的分页方法?

    通常分页查询看起来像这样 有没有更好的方法而不是制作两个几乎相同的方法 其中一个执行 select 另一个执行 count public List
  • VisualSVN Server 用户需要哪些 Windows Server 2008 角色才能登录

    我有一个位于 Windows Server 2008 上的 SVN 服务器 并且我已在 SVN 级别正确设置了我的用户名 读 写访问权限 但是当尝试通过浏览器访问服务器时 我得到了您无权访问此服务器上的 svn project1 为了使这个
  • HGROUP 元素已从 HTML5 规范中删除。可以使用什么替代技术来代替?

    正如你们中的一些人听到的那样hgroup元素正被从HTML5 规范 https www w3 org TR html5 有关更多信息 请参阅W3C HTML 工作组关于撤销请求的决定hgroup来自 HTML5 http lists w3
  • CLIPS 使用规则递增变量

    我想在规则运行时提高安全性 现在它什么也改变不了 human resources n 这一事实确实存在 定义全局 security 0 取消规则1 人力资源 n gt 定义全局 security security 1 这导致 securit
  • 在 SceneKit 中模拟折射

    我正在尝试为一个项目创建一个 ios 9 应用程序 它将使用这些特殊的理论镜头 称为 一个名为 TIM 的光线追踪程序已经从头开始编写 用于模拟这些镜头等 但简单地将其移植到 ios 是不可行的 我通过搜索网站得到的理解 即this htt
  • 在公共基本路线之上构建路线?

    我有一个共同的基本路径 说 get base我需要执行基本身份验证并为该路径下的所有子调用工作 说 get base foo and get base bar 看着http www sinatrarb com intro html Help
  • Excel 和 IE7 - 阻止 IE 打开 Excel 文件

    我有一个 Intranet 网页 用于超链接到文件服务器上的各种文件 本地文件链接的问题是 Microsoft Excel 文件是在 IE7 而不是 Excel 中打开的 这会导致 Excel 文件 VBA 代码和其他功能正常工作 有没有办
  • 添加子视图后 superview 和parentviewcontroller nil

    我认为我错过了一些基本的东西 所以我想向社区寻求一些帮助 我正在构建一个基于基本 iPhone 实用程序应用程序的应用程序 我的 MainView 和 FlipsideView 共享一些元素 因此我为这些部分创建了单独的 ViewContr
  • 与 Riak 一起进行 MapReduce

    有谁有可以在单个 Riak 节点上运行的 Riak 的 mapreduce 示例代码吗 cd riak erl name email protected cdn cgi l email protection setcookie riak p
  • n 维数组构造函数的模板规范

    我正在实现一个 n 维数组类 它是一个模板 如下所示 请注意 数据存储在线性数组中 其长度是所有维度的乘积 template lt class valType int rank gt class NDimensionalArray publ
  • 查找多个变量的所有组合总和为 1

    我正在尝试解方程 x1 x2 x3 xn 1 其中所有的值xi仅限于 0 0 1 0 2 0 9 1 目前 我通过首先生成一个n维数组来解决问题mat 其中每个元素位置的值是轴值的总和 其变化范围为axisValues 0 0 1 1 ma