在 MATLAB 中替代 dec2hex?
Alternative to dec2hex in MATLAB?
我在 MATLAB 中使用 dec2hex
多达 100 次。因此,代码的速度会降低。有一点我使用了 dec2hex
100 次。这将需要 1 分钟或更长时间。我已经为5000分做了同样的事情。但是因为 dec2hex
到 运行 需要几个小时的时间。那么我怎样才能最佳地进行十六进制到十进制的转换呢?除了 dec2hex
之外,还有其他替代方法吗?
例如:
%%Data[1..256]: can be any data from
for i=1:1:256
Table=dec2hex(Data);
%%Some permutation applied on Data
end;
这里我用了dec2hex
超过100次才得到一个点。而且还得用5000积分
数据=
Columns 1 through 16
105 232 98 250 234 216 98 199 172 226 250 215 188 11 52 174
Columns 17 through 32
111 181 71 254 133 171 94 91 194 136 249 168 177 202 109 187
Columns 33 through 48
232 249 191 60 230 67 183 122 164 163 91 24 145 124 200 142
这种数据我的代码会用到。
函数调用在 MATLAB 中(仍然)很昂贵。这是强烈推荐矢量化和伪矢量化的原因之一:在一个函数调用中处理整个 N
值数组比为每个元素调用处理函数 N
次要好得多,因此节省 N-1
次补充调用开销。
那么,你能做什么?以下是一些非互斥的选择:
首先分析您的代码。 某些东西看起来像是执行时间灾难的罪魁祸首,但不一定是。在命令 window 中键入 profview
,选择要 运行 的脚本,然后查看代码的热点在哪里。选择优化那些热点而不是您最初的猜测。
尝试更快的函数。 sprintf
通常快速且灵活:
Table = sprintf('%04X\n', Data);
(并且 — 如果您使用 edit dec2hex
深入研究函数代码 — 您会发现在某些情况下 dec2hex
实际上调用了 sprintf
)。
减少函数调用的次数。假设你必须为存储在中的100个不同长度的数据集构建table元胞数组:
DataSet = cell(1,100);
for k = 1:100
DataSet{k} = fix(1000*rand(k,1));
end;
想法是 assemble 一次性转换单个数组中的所有数字:
Table = dec2hex(vertcat(DataSet{:}));
请注意,这样做的代价是使用补充内存将部分输入组合成一个单一的输入——这样做并不总是很方便。
上面的所有变体。好吧,这个点其实不是一个点。 :-)
我在 MATLAB 中使用 dec2hex
多达 100 次。因此,代码的速度会降低。有一点我使用了 dec2hex
100 次。这将需要 1 分钟或更长时间。我已经为5000分做了同样的事情。但是因为 dec2hex
到 运行 需要几个小时的时间。那么我怎样才能最佳地进行十六进制到十进制的转换呢?除了 dec2hex
之外,还有其他替代方法吗?
例如:
%%Data[1..256]: can be any data from
for i=1:1:256
Table=dec2hex(Data);
%%Some permutation applied on Data
end;
这里我用了dec2hex
超过100次才得到一个点。而且还得用5000积分
数据=
Columns 1 through 16
105 232 98 250 234 216 98 199 172 226 250 215 188 11 52 174
Columns 17 through 32
111 181 71 254 133 171 94 91 194 136 249 168 177 202 109 187
Columns 33 through 48
232 249 191 60 230 67 183 122 164 163 91 24 145 124 200 142
这种数据我的代码会用到。
函数调用在 MATLAB 中(仍然)很昂贵。这是强烈推荐矢量化和伪矢量化的原因之一:在一个函数调用中处理整个 N
值数组比为每个元素调用处理函数 N
次要好得多,因此节省 N-1
次补充调用开销。
那么,你能做什么?以下是一些非互斥的选择:
首先分析您的代码。 某些东西看起来像是执行时间灾难的罪魁祸首,但不一定是。在命令 window 中键入
profview
,选择要 运行 的脚本,然后查看代码的热点在哪里。选择优化那些热点而不是您最初的猜测。尝试更快的函数。
sprintf
通常快速且灵活:Table = sprintf('%04X\n', Data);
(并且 — 如果您使用
edit dec2hex
深入研究函数代码 — 您会发现在某些情况下dec2hex
实际上调用了sprintf
)。减少函数调用的次数。假设你必须为存储在中的100个不同长度的数据集构建table元胞数组:
DataSet = cell(1,100); for k = 1:100 DataSet{k} = fix(1000*rand(k,1)); end;
想法是 assemble 一次性转换单个数组中的所有数字:
Table = dec2hex(vertcat(DataSet{:}));
请注意,这样做的代价是使用补充内存将部分输入组合成一个单一的输入——这样做并不总是很方便。
上面的所有变体。好吧,这个点其实不是一个点。 :-)