MATLAB的博客

实用的建议在前沿的人

笛卡儿的新组合函数在MATLAB -产品和参数扫描2022世界杯八强谁会赢?

我一直是一个 发布说明 呆子,我认为你可以从中学到很多的一系列增强软件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);
方法= [“dbscan”“kmeans 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);
我要使用三种集群数据的方法
方法= [“dbscan”“kmeans kmedoids”];
我从这些实验数据在不同的日子里进行的
日期= datetime ([“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日期为2014年11月20日星期四现代方法kmeans致力于ID = 2日期为2013年10月15日星期二现代方法dbscan致力于ID = 2日期为2014年11月20日星期四现代方法dbscan致力于ID = 2日期为2013年10月15日星期二现代方法kmedoids致力于ID = 2日期为2014年11月20日星期四现代方法kmedoids致力于ID = 3日期为2013年10月15日星期二现代方法kmeans致力于ID = 3日期为2014年11月20日星期四现代方法kmeans致力于ID = 3日期为2013年10月15日星期二现代方法dbscan致力于ID = 3日期为2014年11月20日星期四现代方法dbscan致力于ID = 3日期为2013年10月15日星期二现代方法kmedoids致力于ID = 3日期为2014年11月20日星期四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 4 5 6 1 2 3 4 5 6 7 7 7 8 8 8 9 9 9 10 10 10
似乎做这项工作!我想可以有尽可能多的输入向量,每个组合是一个列。然而,一个问题是,这需要一个许可证深度学习工具箱是无益的,对于那些想要生成参数扫描深度学习。我们考虑做简单的运动 combvec 核心设计的MATLAB但有方面我们会做不同的今天;开始我们不叫它 combvec 因为它不仅仅适用于向量。 combvec 也不支持nonumeric数据:
v1 = (1 7 4);
v2 = 42 8 [9];
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 9 9 9 42 42 42 8 8 8 9 9 9 42 42 42 8 8 8南南南南南南南南南南南南南南南南南南
把这个核心MATLAB的方式将满足用户需求我们已经收集需要相当昂贵的重新设计。这将打破向后兼容性,所以我们决定反对它。这决定了我们的思维过程;我们想要做些!如果不动 combvec 成核心MATLAB然后呢?让我们看看其他方式解决组合问题。

老方案# 2 - meshgrid, ndgrid allcomb

其他三个函数经常推荐MATLAB解决这个问题的答案: meshgrid , ndgrid allcomb 前两个是建在MATLAB allcomb是一个受欢迎的函数在文件交换。 allcomb 是一个一流的作品,几乎已经被下载25000次。的几个评论问为什么这样一个有用的功能不是核心MATLAB的一部分。非常!
在某些情况下所有这些工作的很好。例如,考虑这些输入
v1 = (1 - 2);
v2 = [3 - 4];
我可以用meshgrid这样的
(点,bm) = meshgrid (v1、v2);
M2 = [(:), bm (:))
M2 = 4×2
1 2 3 1 4 2 3 4
ndgird这样
(一个,bn) = ndgrid (v1、v2);
M3 = [(:), bn (:))
M3 = 4×2
1 2 3 1 4 2 4
最后,文件交换的allcomb给我们
M1 = allcomb (v1、v2)
M1 = 4×2
1 2 3 1 4 2 3 4
到目前为止很好但是如果我添加以下两个向量
v3 = [“a”“c”];
v4 =分类(v3);
上述解决方案不再工作:
[我,bm,厘米,dm] = meshgrid (v1、v2、v3 v4);
错误使用meshgrid
太多的输入参数。
[cn, bn, dn] = ndgrid (v1、v2、v3 v4);
结果= [(:),bn (:), cn (:) dn (:))
错误使用分类/ horzcat
无法连接两个数组和一个分类数组。
allcomb (v1、v2、v3 v4)
错误使用分类/猫
无法连接两个数组和一个分类数组。

错误allcomb(第111行)
=重塑(猫(数控+ 1,{:}),[],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
到目前为止很好但我不得不承认你这个函数的某些方面引发了我的方式,我需要与我的治疗师讨论折磨进一步发展与我的问题。

为什么是输出一个表?

返回的结果作为一个表输入数据类型可以被保存在输出自每一列可以容纳不同的数据类型。我们也可以选择一个细胞,但最后还是没有,因为我们发现大多数用户考虑使用先进manueuvers细胞阵列。也很奇怪看到单元阵列作为输出,当所有的输入都是双!大多数人在设计团队优先表

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

虽然我欣赏优雅的表格格式,我可以想象当我宁愿输出是别的东西。最明显的是当所有输入数值数组或单元阵列,如果我是那种喜欢他们的人表。为什么不允许类似以下吗?
%设计选项,我们没有去
C =组合(v1、v2,“OutputFormat”,“数组”);
后接受我5美元捐赠”只是“Jar,发展告诉我,他们认为这种想法但问题在于之间的模糊输入和名称-值对。考虑到对 “OuputFormat”、“数组” 问题就变成了 “定义一个选项或两个额外的输入” 吗?我们可以做精确匹配;如果一个输入” OutputFormat” 然后考虑选择开关,但如果你想要输入的是什么 “OutputFormat” 吗?
R2021a以来,MATLAB支持不同的方式定义名称的参数我们可以坚持,只有新格式被接受。即。
%设计选项,我们没有去
C =组合(v1、v2, OutputFormat =“数组”);
这里的问题是,大量的用户使用传统的 “名称”、“价值” 对多年来。目前,不管您使用哪个方法在大多数功能。在这些情况下,它可能会只有老语法的支持,因为开发人员还没有抽出时间来支持新方法。开始介绍核心MATLAB函数 只有 支持新 name = "价值" 语法可能导致恼人的比这个解决方案满足更多的人。
好的,有人反驳,为什么不包花括号中的输入 {} 为了避免歧义?我们可以做的
%设计选项,我们没有去
C =组合({v1、v2}, OutputFormat =“数组”);
另一个5美元的“只是”jar。我们没有去的原因,这可能是有争议的。就我个人而言,我喜欢它!它解决这个问题通过消除模棱两可之间的输入和选择定义为名称-值对。然而,多年来MathWorks得知总是迫使用户包输入单元阵列会使函数签名有点不寻常,可以迷惑我们的用户。这种考虑胜出和设计被丢弃。
多一个选择:我们可以引入一个参数所需的格式。即函数调用会看起来像这样
%设计选项,我们没有去
C =组合(格式,v1、v2)
例如
%设计选项,我们没有去
C =组合(“细胞”v1、v2)
主要问题在于,用户总是需要类型所需的参数。当大多数人使用 “表” 会有哭的”你为什么不做 “表” 默认”?它也不是可扩展的,永远都不会有任何额外的选项。很多人都不喜欢它!
最终决定,我们不会提供选项来选择输出类型。表支持的大多数用例我们目标和效用函数存在表转换为其他数据类型。
如果你有一个工作流,这导致一个问题,让我们知道!

组合和rowfun——你的新组合参数扫描

我希望你喜欢这peek在窗帘后面……这真的只是一个偷看!我试图总结大量的讨论和我道歉 开发的同事如果我有歪曲他们的想法。时也说了,该做的也做了,我认为我们有一个美丽的新方法支持在MATLAB进行参数清洁工和我希望你享受它
%创建参数扫描结束
experimentID = (1 2 3);
方法= [“dbscan”“kmeans kmedoids”];
日期= datetime ([“15 - 10月- 2013”,“11月20 - - 2014”]);
%形式的组合参数
T =组合(experimentID、方法、日期);
%执行分析使用所有参数
结果= rowfun (@myAnalysis T);

辅助函数

函数结果= myAnalysis (ID、方法,日期)
日期。格式=“eeee嗯d yyyy”;
流(“致力于ID = % d % s现代方法% s \ n”、身份证、日期、方法);
% %做分析
结果= rand ();% %代表实际工作
结束
|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。

Baidu
map