MATLAB中空矩阵的输出差异及维度表示疑问
MATLAB中空矩阵的输出差异及维度表示疑问
嗨,我来帮你拆解这两个MATLAB里的空矩阵相关疑惑~
问题1:为什么z1和z2的输出形式不一样?
这完全是因为zpkdata和pzmap这两个函数的返回值设计逻辑不同:
zpkdata函数是为了兼容多输入多输出(MIMO)系统设计的,它返回的零点、极点都是cell数组——每个cell对应系统中一组输入输出通道的零点/极点。你的系统是单输入单输出(SISO),所以得到的z1是1x1的cell,里面装的就是当前通道的零点集合:一个0x1的空矩阵(因为你的系统没有零点)。- 而
pzmap函数更偏向可视化辅助,它直接返回当前系统的极点和零点数值数组。因为你的系统没有零点,所以直接返回一个0x1的空矩阵,不需要用cell包装。
你可以用这两行代码验证一下:
class(z1) % 输出 'cell' class(z2) % 输出 'double' size(z1{1}) % 输出 [0 1],和size(z2)结果一致
问题2:为什么MATLAB显示“0行1列”,但看不到任何行列?
这里要理解MATLAB里空矩阵的本质:空矩阵不是没有维度,而是有确定的维度但元素数量为0。
0-by-1的维度标注,是MATLAB为了保持输出格式的一致性:当你的系统有零点时,z2会是一个Nx1的列向量(N是零点个数),所以即使没有零点,MATLAB也会维持这个“列向量形状”的维度。这样做的好处是,你后续写代码处理零点时,不用特意判断“有没有零点”的情况——比如遍历零点的循环,在空矩阵下也能正常执行(只是循环体不会运行)。
你看不到实际的行列,是因为确实没有元素存在,但维度信息是MATLAB用来记录数组“形状”的元数据,确保它在参与运算时能符合维度匹配规则(比如和其他列向量进行拼接、运算等)。
附你的测试代码:
clc;clear;close all C=0.1e-6 R=47e3 num=1 den=[-R*C 0] sys=tf(num,den) [z1,p1,k]=zpkdata(sys) [p2,z2]=pzmap(sys)
备注:内容来源于stack exchange,提问作者DSP_CS
相关产品推荐
相关产品推荐

