0
Octave是否有一种方法来矢量化sprintf()?有没有办法在八度脚本中矢量化sprintf()?
请参阅下面的示例。迭代分支按预期工作。当我设置vectorize_sprintf = 1时,我没有得到期望的效果。不是用每个单元一个字符串填充LABELS单元格数组,而是将所有字符串连接到LABELS的第一个单元格中,其余单元格留空。
有没有一种很好的方法来将数字向量化为字符串处理?
%%
%% Graph e^x and ln()
%%
top=8; %% highest power to graph
pow_vec = [0:top]';
ex_vec = e .^ pow_vec;
ln_vec = log(ex_vec);
LABELS=cell(size(ex_vec)); %% Pre-allocate cell matrix
vectorize_sprintf=1;
if (vectorize_sprintf)
%% Vectorize attempt at sprintf is BROKEN
LABELS=sprintf("%d = log2(%d)\n",ln_vec,ex_vec)
else
%% Iterate for sprintf WORKS
counter=1;
for i = pow_vec'
LABELS(counter++) = sprintf("e^%d=%d\nln(%d)=%d",pow_vec(counter),ex_vec(counter) ,ex_vec(counter) ,ln_vec(counter));
endfor
endif
figure(1); %% Graph e^x
hold on;
plot(ln_vec, ex_vec, "r-"); %% solid red line segments
plot(ln_vec, ex_vec, "rx"); %% markers on the datapoints
text(ln_vec, ex_vec, LABELS);
figure(2); %% Graph ln()
hold on;
plot(ex_vec, ln_vec, "r-"); %% solid red line segments
plot(ex_vec, ln_vec, "rx"); %% markers on the datapoints
text(ex_vec, ln_vec, LABELS);
感谢carandraug,该值是在一个恼人的方式围绕转变:ex_vec = E。^[0:2]'; LABELS = strsplit(sprintf(“log(%f)=%f \ n”,ex_vec,ln_vec),“\ n”)(1:end-1)---给出令人惊讶的结果--- ex_vec = 1.0000 2.7183 7.3891 ln_vec = LABELS = { [1,1] =日志(1.000000)= 2.718282 [1,2] =日志(7.389056)= 0.000000 [1 ,3] = log(1.000000)= 2.000000 } 他们为什么转移? –
@JeffTaylor明白了。看看编辑。 – carandraug
Octave手册说:“......矢量化也允许更好的优化......矢量化的最终目标是尽可能地利用硬件的矢量指令或者用软件执行其他优化。”从优化的角度来看,将所有内容干扰到一个字符串中,并用strsplit()将其分割出来是一种比遍历向量元素更糟糕的解决方案。有没有更好的解决方案。 –