2013-11-26 62 views
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); 

回答

0

你的矢量尝试未完全填满的LABELS第一单元,它实际上是将其转换为字符数组(看一看whos LABELS)。我认为sprintf总是只返回一个字符串。由于您使用的是\n,因此您可以使用strsplit来获取单元阵列。

ex_vec = e .^ [0:8]; 
ln_vec = log(ex_vec); 

LABELS = strsplit (sprintf ("%.0f = log2(%.4f)\n", [ln_vec; ex_vec]), "\n")(1:end-1) 

我已经做了如下修改你有什么之前:

  1. 不调换[0:8]等你拿一排,你不必转它再次生成sprintf的矩阵时
  2. %d替换为%.0f%.4f。这是特别重要的剩余%.0f因为log (e^8) = 8.0000但该字符串中使用是fix (log (e^8))这是7或者,您可以圆ln_vec
+0

感谢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 } 他们为什么转移? –

+0

@JeffTaylor明白了。看看编辑。 – carandraug

+0

Octave手册说:“......矢量化也允许更好的优化......矢量化的最终目标是尽可能地利用硬件的矢量指令或者用软件执行其他优化。”从优化的角度来看,将所有内容干扰到一个字符串中,并用strsplit()将其分割出来是一种比遍历向量元素更糟糕的解决方案。有没有更好的解决方案。 –

相关问题