有没有办法在八度脚本中向量化sprintf()?

时间:2013-11-26 22:19:41

标签: octave

Octave有没有办法对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);

1 个答案:

答案 0 :(得分:0)

您的矢量化尝试未填充LABELS的第一个单元格,它实际上是将其转换为char数组(请查看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