Лог-пространство, содержащее определенные точки (Matlab) - PullRequest
1 голос
/ 15 ноября 2011

В Matlab я могу использовать logspace(A,B,N) для генерации вектора длины N, содержащего точки между 10^A и 10^B, равномерно распределенные по логарифмической оси.Однако из-за природы логарифма эти точки обычно оказываются в точках данных, которые сами по себе не имеют смысла, и мне нужно создать пространство журнала с очень большим количеством точек, если я хочу убедиться, что определенная точка данныхточно представлен в векторе.

Есть ли способ указать некоторые точки данных, которые должны быть включены в вектор?

Например, logspace(1,10,30, [25 50 75]) будет генерировать вектор длины30 с точками, распределенными почти одинаково вдоль логарифмической оси, но убедившись, что все точки 25, 50 и 75 включены.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2011

Ниже я подробно остановлюсь на предложении, которое я сделал в комментарии. Сортировка 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
0 голосов
/ 15 ноября 2011

Возможно, вы делаете какой-то график, и вам нужны контрольные точки для этих конкретных значений. В этом случае вы также можете обрабатывать вектор пространства журналов отдельно от специальных значений, например, наложив два графика.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...