在matlab快速UUID生成

101(30天)
西蒙Parten
西蒙Parten 2019年4月29日
回答: 菲利普·坦普尔 2022年3月17日
我想要生成一些uuid。
函数id = makeUUIDs (num)
% idsJ = javaArray (java.util.UUID, num);
id =字符串(num, 1);
我= 1:num
id (i) = java.util.UUID.randomUUID;
结束
% id = arrayfun (@ (x)字符串(x), idsJ);
% id = jstring2string (ids);
结束
不幸的是,这太慢了我的喜欢
aTest = makeUUIDs (100000);
需要19.8秒…然而,实际生成java根据分析器需要0.945秒。谁能更快的方法? ? ?

接受的答案

西蒙Parten
西蒙Parten 2019年10月18日
上面的是,最后只是不够快。下面生成1 e6 uuid为matlab字符串数组,在2.6 s在我的机器上。
好多了。
试试这个;
#包括< iostream >
#包括<字符串>
#包括<列表>
#包括“MatlabDataArray.hpp”
#包括“C: / temp / fastUUID / boost_1_71_0 / boost_1_71_0 /提高/ uuid / uuid.hpp”/ / uuid类
#包括“C: / temp / fastUUID / boost_1_71_0 / boost_1_71_0 /提高/ uuid / uuid_generators.hpp”/ /发电机
#包括“C: / temp / fastUUID / boost_1_71_0 / boost_1_71_0 /提高/ uuid / uuid_io.hpp”/ /流媒体运营商等。
#包括“C: / temp / fastUUID / boost_1_71_0 boost_1_71_0 /提高/ lexical_cast.hpp”/ /流媒体运营商等。
#包括“mex.hpp”
#包括“mexAdapter.hpp”
使用名称空间matlab:数据;
使用matlab:墨西哥人::ArgumentList;
使用名称空间性病;
/ /需要安装https://www.boost.org/
/ / matlabcpp编译器
/ /最后墨西哥人makeUuidArray。cpp的":\ temp \ fastUUID \ boost_1_71_0 \ boost_1_71_0
MexFunction:公共matlab::墨西哥人:函数{
公众:
无效操作符()(ArgumentList输出,ArgumentList输入){
checkArguments(输出,输入);
常量输入int numIds = [0] [0];
ArrayFactory工厂;
boost:: uuid: random_generator发生器;
boost:: uuid: uuid uuid1;
/ /三个变量的字符串向量、tempstring tempUUID
TypedArray < MATLABString >结果=工厂。createArray < MATLABString > ({numIds, 1});
(汽车elem:结果){
uuid1 =发生器();
boost:: lexical_cast elem = < std:: string > (uuid1);
}
输出[0]=结果;
}
无效checkArguments (ArgumentList输出,ArgumentList输入){
std::要查看< matlab::引擎::MATLABEngine > matlabPtr = getEngine ();
ArrayFactory工厂;
/ /检查第一输入参数
如果(输入[0]. gettype () ! = ArrayType::双| |
输入[0]. gettype () = = ArrayType:: COMPLEX_DOUBLE | |
输入[0].getNumberOfElements () ! = 1)
{
matlabPtr - >函数宏指令(u“错误”,
0,
std::向量数组< > ({factory.createScalar (“首先输入必须标量双”}));
}
/ /检查数量的输出
如果(outputs.size () > 1) {
matlabPtr - >函数宏指令(u“错误”,
0,
std::向量数组< > ({factory.createScalar (“只有一个输出返回”}));
}
}
};

更多的答案(2)

菲利普·坦普尔
菲利普·坦普尔 2022年3月17日
这可能是愚蠢得令人难以置信,但看的源代码 tempname () ,你可以看到,你可以简单的做
uuid = char (matlab.lang.internal.uuid ())
这不是一样快 @Simon Parten 慢的解决方案(约1级),但它至少不需要编译c代码,它只使用内置的MATLAB函数。
统计数据:
Trial1
经营:1 e6
总结:18岁316.259 ms
最小值:15.1694亩
中位数:17亩
意思是:18亩
马克斯:702.108402亩
性病:5.847亩

西蒙Parten
西蒙Parten 2019年5月2日
这是我的最佳解决方案
idsJ = javaArray (“以”,num);
id =字符串(num, 1);
我= 1:num
idsJ (i) = javaMethod (“toString”,java.util.UUID.randomUUID);
结束
id =字符串(idsJ);

标签

s manbetx 845

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!