在Matlab中,我可以使用logspace(A,B,N)
生成长度为N
的向量,其中包含10^A
和10^B
之间沿对数轴均匀分布的点。但是,由于对数的性质,这些点通常最终出现在本身没有意义的数据点上,如果我想确定某个数据点,我必须创建一个具有大量点的日志空间完全用向量表示。
我有办法指定应该包含在载体中的某些数据点吗?
例如,logspace(1,10,30, [25 50 75])
将生成长度为30的向量,其中点沿着对数轴均匀分布几乎,但确保包括所有点25,50和75。
答案 0 :(得分:0)
也许你正在做某种情节,你需要的是这些特定值的参考点。如果是这种情况,您也可以将日志空间向量分别处理为特殊值,例如,通过叠加两个图。
x = logspace(A, B, N);
y = f(x); % (whatever function or manipulation you want)
xSpecial = [25, 50, 75];
ySpecial = f(xSpecial);
plot(x, y); % plot function curve
hold on;
plot(xSpecial, ySpecial, 'ro'); % overlay special points with red circles
否则,我喜欢@ reve_etrange的想法,只需将这些特定点添加到矢量中。
在这种情况下,每个元素的计算不依赖于(1)元素的顺序或(2)向量中其他元素的值,因此无需为此目的对输入进行排序计算 - 特别是如果你想在绘图时以不同方式处理特殊值。
相反,只需在最后添加特殊值,然后分割输出向量以获得特殊输出。
xRegular = logspace(A, B, N); % N regular logspace values
xSpecial = [25, 50, 75]; % special particular values
xCombined = [xRegular, xSpecial];
yCombined = f(xCombined); % whatever calculation you are doing
yRegular = yCombined(1:N); % calculated values for xRegular
ySpecial = yCombined(N+1:end); % calculated values for xSpecial
% e.g. plot with special points
plot(xRegular, yRegular);
hold on;
plot(xSpecial, ySpecial, 'ro'); % red circles indicate special points
答案 1 :(得分:0)
下面我将扩展我在评论中提出的建议。不需要对x
进行排序。
special_values; %# vector of "special" points
x = logspace(A,B,N);
for i=1:length(special_values)
[~,idx] = min(abs( x - special_values(i) ));
x(idx) = special_values(i);
end
上述问题:原始值被省略。我试图添加新值而不进行任何排序,但我需要第二个循环。假设special_values
相对较小,那就可以了。
special_values = sort(special_values,'ascend');
x = logspace(A,B,N);
newx = zeros(1,length(x) + length(special_values));
lastx = 1;
lastnewx = 1;
for i=1:length(special_values)
[~,idx] = min(abs( x - special_values(i) ));
if special_values(i) == x(idx)
continue;
elseif special_values(i) > x(idx)
newx(lastnewx:idx+i) = [x(lastx:idx) special_values(i)];
else
newx(lastnewx:idx+i) = [x(lastx:idx-1) special_values(i) x(idx)];
end
lastnewx = idx+i+1;
lastx = idx+1;
end
if newx(end) == 0
newx(lastnewx:end) = x(lastx:end);
end