Векторизация в Matlab, непонятная разница в синтаксисе, вызывающая сбой

Я не понимаю, почему в приведенном ниже примере только x1 превращается в массив из 1000 столбцов, а y - одно число.

x = [0:1:999];
y = (7.5*(x))/(18000+(x));
x1 = exp(-((x)*8)/333);

Любые разъяснения будут высоко оценены!

3 ответа

Решение

Почему x11x1000?

Как указано в документации,

exp(X)возвращает экспонентудля каждого элемента в массивеX,

поскольку x является 1x1000, так -(x*8)/333 является 1x1000 и когда exp()применяется к нему, вычисляются экспоненты всех 1000 элементов и, следовательно, x1 это также 1x1000, В качестве примера,exp([1 2 3])такой же как[exp(1) exp(2) exp(3)],


Почемуyодин номер?

Как указано в документации,

Если A это прямоугольник m -от- n матрица с m~= n, а такжеBэто матрица сnстолбцы, тоx = B/Aвозвращает решение системы уравнений наименьших квадратов x*A = B,

В твоем случае,
A является 18000+xа также size(18000+x)является1x1000т.е. m=1 а также n=1000, а также m~=n
а такжеB является 7.5*xу которого естьn=1000колонны.
(7.5*x)/(18000+x)возвращает вам решение уравнений методом наименьших квадратовx*(18000+x) = 7.5*x,


Заключительные замечания:

  1. x = [0:1:999];Скобки здесь не нужны, и лучше использовать их так:x=0:1:999 ;

  2. Кажется, что вы хотите сделать поэтапное деление для вычисленийx1для чего вы должны использовать./ Оператор, как это:

    y=(7.5*x)./(18000+x);  %Also removed unnecessary brackets
    

Также обратите внимание, что сложение всегда поэлементно. .+ не является допустимым синтаксисом MATLAB (хотя он работает в Octave). Смотрите действительные арифметические операторы массива и матрицы в MATLAB здесь.

3. x1 также есть некоторые ненужные скобки.

На этот вопрос уже ответили другие люди. Я просто хочу указать на небольшую вещь. Вам не нужно писать x = 0:1:999, Лучше написано как x = 0:999 в качестве значения приращения по умолчанию для MATLAB или Octave используется значение 1.

Попробуйте явно указать, что вы хотите выполнять поэлементные операции, а не матричные операции:

y = (7.5.*(x))./(18000+(x));

В общем, .* выполняет поэлементное умножение, ./ поэтапное деление и т. д. [1 2] .* [3 4] доходность [3 8], Отсутствие точек приведет к тому, что Matlab будет использовать матричные операции всякий раз, когда сможет найти разумную интерпретацию ваших входных данных как матриц.

Другие вопросы по тегам