求大神给解释一下这个matlab程序
Num=2;
Output=[];
for i=1:length(Expression)
Output=[Output eval([Expression{i},'(',num2str(Num),')'])];
end
Output
尤其是这个循环体部分, 展开
循环体被执行四次,重点看循环体语句“Output=[Output eval([Expression{i},'(',num2str(Num),')'])];”
这里有两部分:
1、Output = [Output XXX],这里的中括号表示做行方向上的拼接
(省略了逗号,实际可以写成 [Output, XXX])。
举例自己体会一下:
a = [];
b = [1 2; 3 4];
a = [a b]
c = [5 6; 7 8];
a = [a c]
输出:
a =
1 2
3 4
a =
1 2 5 6
3 4 7 8
所以这一部分代码表示不断将XXX拼接到Output的后面。
备注:
[Output, XXX]表示行方向上的拼接(可省略逗号,用空格隔开)
[Output; XXX]表示列方向上的拼接(分号不能省略)
注意逗号和分号的区别。
2、eval([Expression{i},'(',num2str(Num),')'])
eval函数的功能是将一个字符串等价转换为一个对应可执行的matlab语句,举例:
a = 3
eval('b=4')
输出:
a =
3
b =
4
可以发现第二句实际上就是执行一句MATLAB语句,即b=4。
回头来看看表达式[Expression{i},'(',num2str(Num),')'],只看i为1的时候,这句相当于是
['zeros','(',num2str(Num),')']
上面提到中括号内用逗号隔开是做行方向上的拼接,故中括号里面都是字符串时,实际上就是做字符串的拼接。所以i为1时,这个字符串是“zeros(2)”。
因此,可以看到这里随着i的变化,产生了四个字符串,即:
'zeros(2)'
'ones(2)'
'rand(2)'
'magic(2)'
然后调用eval
eval('zeros(2)') -->等价于MATLAB语句zeros(2)
eval('ones(2)') -->等价于MATLAB语句ones(2)
eval('rand(2)') -->等价于MATLAB语句rand(2)
eval('magic(2)') -->等价于MATLAB语句magic(2)
这下可以理解了吧,这个循环体实际上使用MATLAB自带的矩阵函数,生成了4个特殊矩阵,每个矩阵都是2x2的,最后把这4个2x2的矩阵在行方向上拼接到一起。
故最后结果是一个 2x8 的矩阵。