包含特定点的Logspace(Matlab)

时间:2011-11-15 03:12:15

标签: matlab

在Matlab中,我可以使用logspace(A,B,N)生成长度为N的向量,其中包含10^A10^B之间沿对数轴均匀分布的点。但是,由于对数的性质,这些点通常最终出现在本身没有意义的数据点上,如果我想确定某个数据点,我必须创建一个具有大量点的日志空间完全用向量表示。

我有办法指定应该包含在载体中的某些数据点吗?

例如,logspace(1,10,30, [25 50 75])将生成长度为30的向量,其中点沿着对数轴均匀分布几乎,但确保包括所有点25,50和75。

2 个答案:

答案 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