Какой самый короткий способ написать это в Matlab? - PullRequest
3 голосов
/ 02 апреля 2010
lam1 = 0.0:0.1:4.0  
lam = 1.60*lam1-0.30*lam1^2 for 0<lam1<=1
lam = lam1+0.30 for 1<=lam1<=4

У меня есть куча таких. Каков был бы «способ MATLAB» для написания такого рода вещей, если не считать простого цикла по индексам и тестирования значений lam1?

Ответы [ 2 ]

5 голосов
/ 02 апреля 2010

Я думаю, что самым чистым (то есть самым легким для чтения и интерпретации) способом сделать это в MATLAB было бы следующее:

lam = 0:0.1:4;          %# Initial values
lessThanOne = lam < 1;  %# Logical index of values less than 1
lam(lessThanOne) = lam(lessThanOne).*...
                   (1.6-0.3.*lam(lessThanOne));  %# For values < 1
lam(~lessThanOne) = lam(~lessThanOne)+0.3;       %# For values >= 1

Приведенный выше код создает вектор lam и изменяет его записи, используя логический индекс lessThanOne. Это решение имеет дополнительное преимущество работы, даже если начальные значения, заданные для lam, скажем, в порядке убывания (или даже не отсортированы).

2 голосов
/ 02 апреля 2010

Примерно так:

lam1 = 0:0.1:4; %lam1 now has 41 elements 0, 0.1, 0.2, ..., 4.0

lam = lam1;  % just to create another array of the same size, could use zeros()

lam = 1.6*lam1-0.30*lam1.^2;  

% note, operating on all elements in both arrays, will overwrite wrong entries in lam next; more elegant (perhaps quicker too) would be to only operate on lam(1:11)

lam(12:end) = lam1(12:end)+0.3;

но если у вас есть куча таких способов, Matlab может написать функцию для их выполнения.

О, и у вас есть lam1==1 в обоих условиях, вы должны это исправить.

РЕДАКТИРОВАТЬ: для дополнительной краткости вы можете написать:

lam = 1.6*(0:0.1:4)-0.3*(0:0.1:4).^2;
lam(12:end) = (1.1:0.1:4)+0.3;

В этой версии я оставил 1 в первой части, вторая часть начинается в 1.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...