7

我想只从包含虚数的数组中提取实数,我也想从数组中消除虚数。因此,从一个10个元素的数组,其中5个实数和5个虚数,得到一个只有5个元素的数组,它必须是实数元素。这在 MATLAB

编辑:

添加示例

input_array = [ 1, 1+i, -2+2*j, 3, -4, j ];

所需的输出将是

output = [ 1, 3, -4 ];

其中仅包含 的真实元素input_array

4

4 回答 4

12

另一种更矢量化的方式:

sel = a == real(a); % choose only real elements

only_reals = a( sel );
于 2012-12-13T12:39:58.627 回答
5

您可以将isrealarrayfun结合使用来检查数字是否为实数和/或 实数以仅保留实数部分。例子:

a = [1+i 2 3 -1-i];
realidx = arrayfun(@isreal,a);
only_reals = a(realidx);
only_real_part = real(a);

>> only_reals

  = [ 2  3]

>> only_real_part

  = [1 2 3 -1]
于 2012-12-13T12:30:24.583 回答
4

实数的虚部为零,所以:

input_array(imag(input_array)==0);

ans =
    1     3    -4
于 2012-12-13T23:32:48.057 回答
3

你可以用isreal函数来做到这一点。结果isreal没有给出向量输出,这对 MATLAB 来说很奇怪,因为它通常会给出。因此,您需要使用 for 循环。

arr = [1+i 5 6-3i 8];
arrReal = [];
for idx = 1:numel(arr)
    if isreal(arr(idx))
        arrReal(end+1) = arr(idx);
    end
end

我想这里的好人会想出一个无循环的解决方案。

夏编辑:

预分配输出结果的版本

arrReal = NaN( size(arr) ); % pre-allocation
for idx = 1:numel(arr)
    if isreal( arr(idx) )
        arrReal(idx) = arr(idx);
    end
end
arrReal( isnan( arrReal ) ) = []; % discard non-relevant entries

当然,这个目标可以在没有循环的情况下实现(参见其他答案)。但是对于这个循环版本,预分配是一个重要的组成部分。

于 2012-12-13T12:29:54.070 回答