Я хочу заполнить матрицу 10x15 в MATLAB, используя формулу z(i, j) = 2 * x(i) + 3 * y(j)^2, так что каждая запись в (i, j) = z(i, ж). У меня есть массивы для x и y размером 10 и 15 соответственно.
Я выполнил задачу, используя приведенный ниже код, но я хочу сделать это одной строкой, так как мне сказали, что это возможно. есть идеи?
x = linspace(0,1,10);
y = linspace(-0.5,0.5,15);
z = zeros(10,15);
m_1 = 2;
m_2 = 3;
for i = 1:length(x)
for j = 1:length(y)
z(i, j) = m_1*x(i) + m_2*y(i)^2;
end
end
Похоже, у вас есть ошибка в исходном цикле:
Вы используете индекс i
дважды: m_1*x(i) + m_2*y(i)^2
.
В результате все столбцы матрицы z
одинаковы.
Для применения формулы z(i, j) = 2*x(i) + 3*y(j)^2
используйте следующий цикл:
x = linspace(0,1,10);
y = linspace(-0.5,0.5,15);
z = zeros(10,15);
m_1 = 2;
m_2 = 3;
for i = 1:length(x)
for j = 1:length(y)
z(i, j) = m_1*x(i) + m_2*y(j)^2;
end
end
Для реализации вышеуказанного цикла с использованием одной строки мы можем сначала использовать сетка.
Замените цикл на:
[Y, X] = meshgrid(y, x);
Z = m_1*X + m_2*Y.^2;
Для расширений читайте документацию сетка, это намного лучше, чем любое из расширений, которые я могу написать...
Следующая команда дает тот же результат, что и ваш исходный цикл (но, вероятно, это не имеет значения):
Z = repmat((m_1*x + m_2*y(1:length(x)).^2)', [1, length(y)]);
Тестирование:
max(max(abs(Z - z)))
ans =
0
Большое спасибо за это! :)
Введите
3 * y.^2
и посмотрите, что произойдет. Затем введитеx .* y.'
и посмотрите, что произойдет. При этом у вас должны быть все ваши строительные блоки.