Matlab复杂矩阵幅度

时间:2014-07-10 20:43:09

标签: matlab complex-numbers

我有一个矩阵S,比如:

1  4  7
2  5  8
3  6  9

然后我制作a=complex(S{2},S{3})并想找到abs(a);。这在MATLAB中是不可能的,因为a不是整数 - 它是一个矩阵。如何获得矩阵a的每一行的幅度?

PS:使用textscan()作为S = textscan(fileID,'%d %d %d', 'delimiter','\t');从文本文件中读取矩阵。

第二个问题:

再次假设有以下S矩阵。

1  4  7  2  1
2  5  8  3  4
3  6  9  6  8 

现在我想以这样的方式排列它们,即2,3和4,5列交替:

4  2
7  1
5  3
8  4
6  6
9  8

如果不使用循环,我该怎么做? 感谢。

1 个答案:

答案 0 :(得分:2)

在评论中考虑我的假设,我将假设第二列由矩阵的实部组成,而第三列由您的虚构组成。您的矩阵S实际上是单元格元素数组。您无需使用complex,然后abs。您可以简单地取出每个列,分别对它们进行平方,将它们加在一起并取平方根。我要做的是将单元格数组转换为2D矩阵,将其强制转换为 double ,以便在找到幅度时允许浮点精度,并执行上面刚刚执行的操作。这是必要的,因为abssqrt仅适用于浮点数。由于来自S的{​​{1}}分隔符,int32中的元素已经%d。换句话说:

textread
因此,

Smat = double(cell2mat(S)); realComp = Smat(:,2); imagComp = Smat(:,3); mag = sqrt(realComp.^2 + imagComp.^2); 将为您返回每行的大小,假设第二列是实部,第三部分是我们指定的虚部。


但是,如果您使用magcomplex 设置,则可以这样做:

abs

这仍然可以给你与我们上面讨论过的相同的结果。


修改

在上面的帖子中看到您的编辑,我们可以通过对矩阵进行子集化,然后将Smat = double(cell2mat(S)); imagNumbers = complex(Smat(:,2), Smat(:,3)); mag = abs(imagNumbers); 应用于所需矩阵的每个部分来轻松实现。换句话说:

reshape

Smat = double(cell2mat(S)); realMat = Smat(:,2:3); %// Grab second and third columns imagMat = Smat(:,4:5); %// Grab fourth and fifth columns realCol = reshape(realMat.', [], 1); % // Form the columns like you specified imagCol = reshape(imagMat.', [], 1); finalMatrix = [realCol imagCol]; 应包含您在单个矩阵中指定的上述两列。