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);
答案 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)
我对您之前所做的进行了以下更改:
%d
替换为%.0f
和%.4f
。特别重要的是%。0f,因为log (e^8) = 8.0000
但是字符串中使用的是fix (log (e^8))
,即7。或者,您可以围绕ln_vec