(Добавлен воспроизводимый пример)
sqrt(as.complex(c(4,9,-4,-9,16))) # 2+0i 3+0i 0+2i 0+3i 4+0i
class(sqrt(as.complex(c(4,9,-4,-9,16)))) # complex
sqrt(as.complex(c(4,9,-4,-9,16)))[1] # 2+0i
class(sqrt(as.complex(c(4,9,-4,-9,16)))[1]) # complex
Итак, я хочу определить конкретную функцию извлечения квадратного корня (sqrtT), которая сохранит реалистичность / сложность своих элементов. По сути, я хочу это:
sqrtT(as.complex(c(4,9,-4,-9,16))) # 2 3 0+2i 0+3i 4
class(sqrtT(as.complex(c(4,9,-4,-9,16)))) # complex
sqrtT(as.complex(c(4,9,-4,-9,16)))[1] # 2
class(sqrtT(as.complex(c(4,9,-4,-9,16)))[1]) # numeric
class(sqrtT(as.complex(c(4,9,-4,-9,16)))[3]) # complex
Что я сделал:
Я нашел следующие инструменты:
1.
Re(sqrt(as.complex(c(4,9,-4,-9,16)))) # 2 3 0 0 4
Im(sqrt(as.complex(c(4,9,-4,-9,16)))) # 0 0 2 3 0
Между прочим, он должен содержать тип в себе, то есть, когда я говорю sqrtT(as.complex(c(4,9,-4,-9,16))) #= 2 3 0+2i 0+3i 4
, отображение этого вывода (2 3 0+2i 0+3i 4
), хотя, по сути, иметь все такие сложные, я не хочу. Моя проблема не только в отображении.
2. Есть способ различать содержимое элементов в векторе:
is.numeric(0+2i) # FALSE
is.numeric(2) # TRUE
3. Индексы с мнимой частью не равной 0 и равной 0:
Пусть вектор будет v.
v <- c(-1,4,9,-4,-9,0,16)
# The indices with imaginary part non-equal to 0 (IM<>0):
IMneq0 <- setdiff(which(as.numeric(sqrt(as.complex(v))) %in% 0),which(sqrt(as.complex(v))==0) )
IMneq0 # 1,4,5
# The indices with imaginary part equal to 0 (IM=0):
IMeq0 <- setdiff(1:length(sqrt(as.complex(v))),IMneq0 )
IMeq0 # 2 3 6 7
Автоматическое принуждение к комплексу можно обойти с помощью списков.
Любая идея?
x <- c(2, 0+2i); typeof(x[1]): "complex"
- person mt1022   schedule 31.08.2017