【问题标题】:Logspace containing specific points (Matlab)包含特定点的日志空间(Matlab)
【发布时间】:2011-12-29 04:24:11
【问题描述】:

在 Matlab 中,我可以使用 logspace(A,B,N) 生成长度为 N 的向量,其中包含沿对数轴均匀分布的 10^A10^B 之间的点。但是,由于对数的性质,这些点通常会出现在本身没有意义的数据点上,如果我想确保某个数据点能够在向量中精确表示。

我有没有办法指定应该包含在向量中的某些数据点?

例如,logspace(1,10,30, [25 50 75]) 会生成一个长度为 30 的向量,其中点几乎沿对数轴均匀分布,但要确保包含所有点 25、50 和 75。 p>

【问题讨论】:

  • 为什么不只添加所需的点,选择性地省略logspace 输出中最近的点?
  • @reve_etrange:我目前正在将它们添加到向量中,然后对整个事物进行排序,但我认为它很难看,于是去寻找更漂亮的东西 =) 在我的情况下,排序不是性能问题 - 但它可能是,所以我很好奇我是否能够解决它。

标签: matlab


【解决方案1】:

也许您正在做某种情节,而您需要的是这些特定值的参考点。如果是这种情况,您还可以将日志空间向量分别处理为特殊值,例如,通过叠加两个图。

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

【讨论】:

  • 在这种情况下,我在对数空间向量上进行了相当混乱的计算,以得到最终要绘制的东西。但是,我还需要计算特定点的值(即不仅要绘制它们),而且我的主要目标是只对包含所有点的向量执行一次凌乱的计算。
  • 很公平。尽管我认为如果情况如您所描述的那样,唯一的潜在问题是代码重复(而不是速度),可以通过将点包含在向量中或将所有杂乱的计算放入函数中来解决此问题。如果您乐于单独绘制特殊点,您甚至不需要对初始 logspace+specialpoints 向量进行排序 - 只需在获得输出向量时将它们拼接即可。
  • 这实际上是一个很棒的解决方案:如果我只是将值附加到末尾,并在绘图时再次将它们切掉,我根本不需要对数组进行排序或循环,我可以仍然可以轻松完成所有操作!如果您将其添加到您的实际答案中,我会接受它=)
  • @Tomas 完成了。不确定我的解释是否足够清楚,但似乎你还是理解了这个建议:)
【解决方案2】:

下面我将扩展我在评论中提出的建议。无需对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

【讨论】:

  • 我不确定,但如果你使用zeros(...,1),性能可能会更好;并在开头转置xx = x';,因为 MATLAB 是列优先的。另一方面,我听说它现在更擅长处理一维数组的这种情况。
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 2016-10-30
  • 1970-01-01
  • 2011-07-14
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多