在matlab中写这个的最短方法是什么?

时间:2010-04-02 14:41:16

标签: matlab

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 个答案:

答案 0 :(得分:5)

我认为在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,并使用logical index lessThanOne修改其条目。即使给予lam的初始值是降序(甚至是未排序的),此解决方案还具有工作的附加好处。

答案 1 :(得分:2)

这样的事情:

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

开始