我有一个矩阵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
如果不使用循环,我该怎么做? 感谢。
答案 0 :(得分:2)
在评论中考虑我的假设,我将假设第二列由矩阵的实部组成,而第三列由您的虚构组成。您的矩阵S
实际上是单元格元素数组。您无需使用complex
,然后abs
。您可以简单地取出每个列,分别对它们进行平方,将它们加在一起并取平方根。我要做的是将单元格数组转换为2D矩阵,将其强制转换为 double ,以便在找到幅度时允许浮点精度,并执行上面刚刚执行的操作。这是必要的,因为abs
和sqrt
仅适用于浮点数。由于来自S
的{{1}}分隔符,int32
中的元素已经%d
。换句话说:
textread
因此, Smat = double(cell2mat(S));
realComp = Smat(:,2);
imagComp = Smat(:,3);
mag = sqrt(realComp.^2 + imagComp.^2);
将为您返回每行的大小,假设第二列是实部,第三部分是我们指定的虚部。
但是,如果您使用mag
和complex
设置,则可以这样做:
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];
应包含您在单个矩阵中指定的上述两列。