MATLAB博客

给处于领先地位的人的实用建议

新的组合函数在MATLAB -笛卡尔积和参数扫描下载188bet金宝搏

我一直是个 发布说明 作为一个书呆子,我认为你可以从每一个新版本的软件(如MATLAB)中学习到很多增强功能。甚至在我在这里工作之前,当一个新版本的MATLAB发布时,我就会花很长时间在发布说明中寻找任何可能有用或直接有趣的东西。
我喜欢思考每个功能背后的故事。为什么开发人员选择开发这个东西,为什么是现在?它能解决什么问题?为什么它被设计成这样?为什么会有明显的限制……难道开发者没有注意到这些吗?我该如何使用它呢?
这让我想到了新的东西 组合 在R2023a中,当我看到发布说明时,我并没有真正理解这一点,因为我可以想到一堆其他方法来实现它所做的事情。我联系了开发团队的负责人 组合 问他的故事。以下是我所学到的。

组合有什么作用?

医生告诉我们组合会 “生成数组的所有元素组合”。 输出为 总是 一个表。以下几个例子胜过1000个单词:
T =组合([1 8 6],[9 3 2])
T = 9×2表
Var1 Var2
1 1 9
2 1 3.
3. 1 2
4 8 9
5 8 3.
6 8 2
7 6 9
8 6 3.
9 6 2
每一行都是一个组合,其中第一个元素来自第一个向量,第二个元素来自第二个向量。
组合 函数可以接受任意数量的输入参数,并且可以混合使用数据类型。事实上,您可以混合数据类型,这就是为什么输出总是一个表,因为表允许保存输入数据类型。
experimentID = [1 2 3];
方法= ["kmeans" "dbscan" "kmedoids"];
日期=分类([“小”“大”]);
T =组合(experimentID,方法,日期)
T = 18×3表
experimentID 方法 日期
1 1 “kmeans”
2 1 “kmeans”
3. 1 “dbscan”
4 1 “dbscan”
5 1 “kmedoids”
6 1 “kmedoids”
7 2 “kmeans”
8 2 “kmeans”
9 2 “dbscan”
10 2 “dbscan”
11 2 “kmedoids”
12 2 “kmedoids”
13 3. “kmeans”
14 3. “kmeans”
差不多就是这样!有一些 当然还有文档中包含的其他细节 但是如果你理解了上面的两个例子,你就掌握了它的要点。

组合能解决什么问题?

元素组合通常用于参数扫描。例如,假设我有3个实验,id分别是1 2和3。
experimentID = [1 2 3];
我将使用三种方法中的一种对数据进行聚类
方法= ["kmeans" "dbscan" "kmedoids"];
我有不同时间进行的实验数据
日期=日期时间([“15 - 10月- 2013”“11月20 - - 2014”]);
我可以形成这些输入变量的所有可能组合:
T =组合(experimentID,方法,日期)
T = 18×3表
experimentID 方法 日期
1 1 “kmeans” 2013年- 10月15日
2 1 “kmeans” 11月20 - - 2014
3. 1 “dbscan” 2013年- 10月15日
4 1 “dbscan” 11月20 - - 2014
5 1 “kmedoids” 2013年- 10月15日
6 1 “kmedoids” 11月20 - - 2014
7 2 “kmeans” 2013年- 10月15日
8 2 “kmeans” 11月20 - - 2014
9 2 “dbscan” 2013年- 10月15日
10 2 “dbscan” 11月20 - - 2014
11 2 “kmedoids” 2013年- 10月15日
12 2 “kmedoids” 11月20 - - 2014
13 3. “kmeans” 2013年- 10月15日
14 3. “kmeans” 11月20 - - 2014
一旦我在一个表中有了所有这些组合,我就可以对所有这些组合运行分析函数。一种方法是使用 rowfun 它使用输入表中每一行的内容作为函数的参数。我定义了一个无关紧要的东西 myAnalysis 函数,以展示这是如何工作的。
结果= rowfun(@myAnalysis,T);
在ID = 1日期为2013年10月15日星期二现代方法kmeans致力于ID = 1日期为2014年11月20日星期四现代方法kmeans致力于ID = 1日期为2013年10月15日星期二现代方法dbscan致力于ID = 1日期为2014年11月20日星期四现代方法dbscan致力于ID = 1日期为2013年10月15日星期二现代方法kmedoids致力于ID = 1日期为2014年11月20日星期四现代方法kmedoids致力于ID = 2日期为2013年10月15日星期二现代方法kmeans致力于ID = 2日期为11月20日星期四2014wih method kmeans Working on ID=2 dated Tuesday October 15 2013 wih method dbscan Working on ID=2 dated Thursday November 20 2014 wih method dbscan Working on ID=2 dated Tuesday October 15 2013 wih method kmedoids Working on ID=2 dated Thursday November 20 2014 wih method kmedoids Working on ID=3 dated Tuesday October 15 2013 wih method kmeans Working on ID=3 dated Thursday November 20 2014 wih method kmeans Working on ID=3 dated Tuesday October 15 2013 wih method dbscan Working on ID=3 dated Thursday November 20 2014 wih method dbscan Working on ID=3 dated Tuesday October 15 2013 wih method kmedoids Working on ID=3 dated Thursday November 20 2014 wih method kmedoids
现在我们已经看到了一个新的工作流程的例子 组合 允许。我认为探索它设计背后的一些想法会很有趣。

旧解决方案#金宝搏官方网站1 - combvec

当然,人们已经进行了很长时间的参数扫描,并且有一系列常用的解决方案。金宝搏官方网站然而,所有这些都存在一些问题,这导致我们决定创造一些新的东西。
其中一个函数是 combvec 在深度学习工具箱中——这是一个非常古老的函数,在深度学习变得很酷之前,它就在深度学习工具箱中了,我们称之为神经网络工具箱。
A1 = [1 2 3;4 5 6];
A2 = [7 8;9 10];
A4 = combvec(a1,a2)
a4 = 4×6
1 2 3 1 2 3 4 5 6 4 5 6 7 7 7 8 8 8 9 9 9 10 10 10
似乎很管用!我可以有任意多的输入向量每个组合都是一列。然而,有一个问题是,这需要一个深度学习工具箱的许可证,这对于那些想要为深度学习以外的任何东西生成参数扫描的人来说是没有帮助的。我们确实考虑过简单地搬家 combvec 到核心MATLAB,但有一些方面的设计,我们今天会做不同的;首先是我们不会打电话的事实 combvec 因为它不仅仅适用于向量。 combvec 也不支持非数字数据:金宝app
V1 = [1 7 4];
V2 = [9 42 8];
V3 = [“a”“c”];
V4 = combvec(v1,v2,v3)
v4 = 3×18
1 7 4 1 7 4 1 7 4 1 7 4 1 7 4 1 7 4 1 7 4 9 9 9 42 42 42 8 8 8 8 8 9 9 9 9 42 42 8 8 8南南南南南南南南南南南南南南南南南南南南南南南南南南南南南南南南南南南
要把它引入核心MATLAB,以满足我们收集的用户需求,需要进行相当大的重新设计。这将破坏向后兼容性,所以我们决定不这么做。这个决定开启了我们的思考过程;我们想做点什么!如果不搬家 combvec 然后呢?让我们看看人们解决组合问题的其他方法。

旧的解决方案金宝搏官方网站#2 -网格,ndgrid和allcomb

在MATLAB Answers中经常推荐另外三个函数来解决这个问题: meshgrid ndgrid 而且 allcomb 前两个是内置在MATLAB中,而allcomb是文件交换中的一个流行函数。 allcomb 是一部被下载了近25000次的优秀作品。有几篇评论问,为什么这么有用的功能不是核心MATLAB的一部分。非常!
所有这些在特定的情况下都可以正常工作。例如,考虑这些输入
V1 = [1 2];
V2 = [3 4];
我可以用这样的网格
[am, bm] = meshgrid(v1,v2);
M2 = [am(:), bm(:)]
M2 = 4×2
1 3 1 4 2 3 2 4
像这样
[an, bn] = ndgrid(v1,v2);
M3 = [an(:), bn(:)]
M3 = 4×2
1 3 2 3 1 4 2 4
最后,文件交换的allcomb提供给我们
M1 = allcomb(v1,v2)
M1 = 4×2
1 3 1 4 2 3 2 4
到目前为止还不错,但是如果我把下面两个向量相加
V3 = [“a”“c”];
V4 =分类(v3);
上述解决方案不再有效金宝搏官方网站:
[am, bm, cm, dm] = meshgrid(v1,v2, v3, v4);
使用网格时出错
输入参数太多。
[an, bn, cn, dn] = ndgrid(v1,v2,v3,v4);
Result = [an(:), bn(:), cn(:) dn(:)]
使用categorical/horzcat时出错
无法连接双数组和分类数组。
allcomb (v1、v2、v3 v4)
使用categorical/cat出错
无法连接双数组和分类数组。

allcomb错误(第111行)
A =重塑(cat(NC+1,A{:}), [], NC);
组合 函数工作得很好
组合(v1、v2、v3 v4)
ans = 16×4表
v1 v2 v3 v4
1 1 3. “一个” 一个
2 1 3. “一个” c
3. 1 3. “c” 一个
4 1 3. “c” c
5 1 4 “一个” 一个
6 1 4 “一个” c
7 1 4 “c” 一个
8 1 4 “c” c
9 2 3. “一个” 一个
10 2 3. “一个” c
11 2 3. “c” 一个
12 2 3. “c” c
13 2 4 “一个” 一个
14 2 4 “一个” c
到目前为止一切顺利,但我必须向你承认,这个功能的某些方面触发了我,我需要与我的治疗师讨论,所以我用我的问题进一步折磨发展。

为什么输出是一个表?

将结果以表形式返回允许在输出中保留输入数据类型,因为每列可以保存不同的数据类型。我们也可以选择一个单元格,但我们决定不这样做,因为我们发现大多数用户认为使用单元格数组是高级的操作。此外,当所有输入都是双输入时,看到单元格数组作为输出是非常奇怪的!设计团队中的大多数人更喜欢表格

为什么不允许用户更改输出格式?

尽管我很欣赏表格格式的优雅,但我可以想象,有时我更希望输出的是其他东西。最明显的是数组,当所有输入都是数字或单元格数组时,如果我是那种喜欢它们而不是表格的人。为什么不允许这样的事情发生呢?
一个我们没有采用的设计选项。
C =组合(v1,v2,“OutputFormat”“数组”);
在接受我向“just”Jar捐赠的5美元后,开发人员告诉我,他们考虑过这个想法,但问题在于输入和名称-值对之间的模糊性。给定这对 “OuputFormat”、“数组” 问题就变成了 "对是否定义了一个选项或两个额外的输入" ?我们可以做精确匹配;如果输入是" OutputFormat” 然后考虑它是一个选项开关但是如果你想要输入 “OutputFormat”
自R2021a以来,MATLAB支持定义名称-值参金宝app数的不同方式,因此我们可以坚持只接受新的格式。即。
一个我们没有采用的设计选项。
C =组合(v1,v2,OutputFormat=“数组”);
这里的问题是,我们的大量用户一直在使用传统的 “名称”、“价值” 在巴黎呆了很多年。目前,在大多数函数中使用哪种方法并不重要。在那些确实重要的情况下,它可能只支持旧的语法,因为开发人员还没有开始支持新方法。金宝app开始介绍MATLAB核心函数 只有 金宝app支持更新的 name = "价值" 语法可能会导致超出此解决方案所能满足的更多人感到厌烦。
有人反驳说,为什么不把输入用大括号括起来呢 {} 为了避免歧义?我们可以这样做
一个我们没有采用的设计选项。
C = combination ({v1,v2},OutputFormat=“数组”);
在“公正”罐子里再放5美元。我们没有这么做的原因可能有争议。就我个人而言,我喜欢它!它通过消除定义为名称-值对的输入和选项之间的歧义来解决这个问题。然而,多年来MathWorks已经认识到,总是强迫用户将输入打包到单元格数组中会使函数签名有点不寻常,这可能会让我们的用户感到困惑。这一考虑最终胜出,设计被放弃。
还有一个选项:我们可以引入一个必需的FORMAT参数。也就是说,函数调用应该是这样的
一个我们没有采用的设计选项。
C =组合(格式,v1,v2)
例如
一个我们没有采用的设计选项。
C =组合(“细胞”v1、v2)
这样做的主要问题是用户总是需要输入所需的参数。大多数人最终都吸毒了 “表” 会有人哭喊:“你为什么不做? “表” 默认”?它也是不可扩展的,不可能有任何额外的选项。没有多少人喜欢它!
最终,我们决定不提供选择输出类型的选项。表支持我们所针金宝app对的大多数用例,并且存在将表转换为其他数据类型的实用函数。
如果您的工作流程导致了我们的问题,请让我们知道!

组合和rowfun——用于参数扫描的新组合

我希望你喜欢这个幕后的秘密……这真的只是一个窥探!我试图在这里总结大量的讨论,我向我的同事道歉 如果我以任何方式歪曲了他们的想法。当所有这些都说了,做了,我认为我们有一个漂亮的新方法来支持在MATLAB中进行参数扫描,我希望你喜欢它金宝app
创建要扫描的参数
experimentID = [1 2 3];
方法= ["kmeans" "dbscan" "kmedoids"];
日期=日期时间([“15 - 10月- 2013”“11月20 - - 2014”]);
形成所有实参的组合
T =组合(experimentID,方法,日期);
使用所有参数执行分析
结果= rowfun(@myAnalysis,T);

辅助函数

函数result = myAnalysis(ID,方法,日期)
日期。格式=“eeee MMMM d yyyy”
流("使用方法%s\n处理ID=%d,日期为%s "、身份证、日期、方法);
在这里进行分析
Result = rand();实际工作的代理
结束
|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。