Создать массивы на основе другого массива - PullRequest
0 голосов
/ 15 января 2020
% create variable x with array of all necessary values
x=linspace(0.1,13,50);

for i=x
    % create equation to determine y
    y=(sqrt(2.*i)*4*i.^3)/(4.*i+7.^(i/10));
    %create equation to determine z
    z=log10(2.*i+5)+(4.*i+exp(i))/(2./3+4.*i.^2);
end

Используя Matlab и я пытаюсь использовать значения из моего массива x, чтобы создать два массива, y и z, я довольно новичок в matlab и мне трудно, спасибо.

Ответы [ 2 ]

1 голос
/ 15 января 2020

Проблема в вашем коде в том, что вы не правильно использовали for l oop. Вы можете запустить индекс x, а затем присвоить x(i) новой переменной k в каждой итерации, то есть

x=linspace(0.1,13,50);

for k = 1:length(x)
    i = x(k);
    % create equation to determine y
    y(k) =(sqrt(2.*i)*4*i.^3)/(4.*i+7.^(i/10));
    %create equation to determine z
    z(k) =log10(2.*i+5)+(4.*i+exp(i))/(2./3+4.*i.^2);
end

Поскольку MATLAB может векторизовать операции, то вы Рекомендуется сделать это, как показано ниже, чтобы ускорить (for l oop в MATLAB стоит дорого)

x = linspace(0.1,13,50);
y = (sqrt(2*x).*4.*x.^3)./(4*x+7^(x/10));
z = log10(2*x+5)+(4*x+exp(x))./(2/3 + 4*x.^2);

Замечания : вы должны быть осторожны в разнице между .* и * или ./ и /, где * и / не являются поэлементными операциями.

0 голосов
/ 15 января 2020

Метод 1:

Вы можете инициализировать y и z в пустые массивы и просто добавить соответствующий результат в конце:

% create variable x with array of all necessary values
x=linspace(0.1,13,50);

y=[];
z=[];

for i=x
    % create equation to determine y
    y(end+1)=(sqrt(2.*i)*4*i.^3)/(4.*i+7.^(i/10));
    %create equation to determine z
    z(end+1)=log10(2.*i+5)+(4.*i+exp(i))/(2./3+4.*i.^2);
end

Этот подход может оказаться низкая эффективность с точки зрения эффективности, поскольку размер y и z изменяется динамически.

Метод 2:

Если вы все еще хотите использовать for l oop, Лучше предварительно выделить память для y и z и повторить индексы x, например:

% create variable x with array of all necessary values
x=linspace(0.1,13,50);

% Memory allocation
y = zeros(1, length(x));
z = zeros(1, length(x));

for i = 1 : length(x)
    % create equation to determine y
    y(i)=(sqrt(2.*x(i)*4*x(i).^3)/(4.*x(i)+7.^(x(i)/10));

    %create equation to determine z
    z(i)=log10(2.*x(i)+5)+(4.*x(i)+exp(x(i)))/(2./3+4.*x(i).^2);
end

Метод 3 (предпочтительный):

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

x = linspace(0.1,13,50);
y = (sqrt(2.*x)*4*.*x.^3) ./ (4*x + 7.^(x./10));
z = log10(2*x+5) + (4*x + exp(x)) ./ (2/3 + 4*x.^2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...