把双精度复数转换为有理数形式的实部和虚部

Mathematica中涉及到下面的几个函数:

RealDigits

把小数表示成各个位数及其十进制指数的形式(但丢失符号位)

FromDigits

RealDigits的结果,还原这个数,但表示为有理数形式(无法恢复丢失的符号位信息)

Sign

考虑到符号的丢失,需要通过Sign函数获取符号,然后相乘。

这些主要对实数操作,对复数操作的时候,还需要用ImRe函数提取出虚部和实部之后分别处理;然后把实部和虚部乘以虚数单位相加得到转换并复原的复数。

对于向量和矩阵操作的时候,可能用到Map, Apply之类的命令(函数)。

举个例子可能更加生动具有可操作性。比如,这个mat二进制数据格式的文件(如果这个链接失效了,用户可以自己用随机数发生器生成一些数据作为练习之用),包含了 18×18 的复数矩阵 A 和 18×1 的实向量 b。

如何把它们都变成有理数表示的形式呢?

先用Import导入数据:

data=Import["e:\\Downloads\\data1.mat"];

所得到的data是一个包含了两个元素的List:

复矩阵A18×18 放在 data[[1]]中,而实数向量 b18×1放在 data[[2]]中。转换它们的代码分别是:

(Map[FromDigits, [email protected]([email protected][[1]]), {2}]*
   Sign[data[[1]] // Re] +
  I *Sign[data[[1]] // Im]*
   Map[FromDigits, [email protected]([email protected][[1]]), {2}])

(FromDigits @@@ RealDigits[data[[2]]])*Sign[data[[2]]]

从上面可以看出,向量的转换简单一些;实数的转换尤其是。但对矩阵、尤其是复数矩阵作转换时,颇为繁琐。好在万变不离其宗。稍作调整之后,这样就完成了转化。

下面这些图片不知道怎么回事??

时间: 2024-10-11 00:04:36

把双精度复数转换为有理数形式的实部和虚部的相关文章

java语言将任意一个十进制数数字转换为二进制形式,并输出转换后的结果

1 package com.llh.demo; 2 3 import java.util.Scanner; 4 5 /** 6 * 7 * @author llh 8 * 9 */ 10 public class Test { 11 /* 12 * 将任意一个十进制数数字转换为二进制形式,并输出转换后的结果(使用数组存储) 13 */ 14 public static void main(String[] args) { 15 Scanner sc = new Scanner(System.in

识别字符串中的整数并转换为数字形式

识别字符串中的整数并转换为数字形式(40分) 问题描述: 识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数. 要求实现函数: void take_num(const char *strIn, int *n, unsigned int *outArray) [输入] strIn:   输入的字符串 [输出] n:       统计识别出来的整数个数 outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数, outArray[

将点分式形式的掩码转换为十进制形式的掩码

在用awk处理文本时,需要将源数据为点分式形式的掩码转换为十进制形式的掩码,下边的函数可简单实现: 函数cdr2mask function (mask_point) { num=gsub("255.","",mask_point) #print mask_point gsub(".0","",mask_point) #print mask_point mask=mask_point-0 for(i = 0;mask >

数字形式的人民币转换为大写形式

/// <summary> /// 转换人民币大小金额 /// </summary> /// <param name="num">金额</param> /// <returns>返回大写形式</returns> public string CmycurD(decimal num) { string str1 = "零壹贰叁肆伍陆柒捌玖"; //0-9所对应的汉字 string str2 = &q

复数的表示形式

复数的的表示形式 这篇文档讲的比较好  https://wenku.baidu.com/view/4229ca748e9951e79b892759.html  ,我这里为其总结: 记住右边的这个复平面,就好记住这三种表达方式. 原文地址:https://www.cnblogs.com/beforeluck-shang/p/8529038.html

Windows 上将一个由多字节字符串转换为 Unicode 形式

我们使用 Windows 函数 MultiByteToWideChar 将多字节字符串转换为宽字符串.如下所示: int MultiByteToWideChar( UINT uCodePage, //标识了与多字节字符关联的一个代码页值 DWORD dwFlags, //允许进行额外控制, 但一般传入 0 PCSTR pMultiByteStr, //要转换的字符串 int cbMultiByte, //字符串的长度, 若传入 -1, 则自动判断长度 PWSTR pWideCharStr, //

利用sed将xml报文转换为分隔符形式报文

原始xml文本如下 1 <?xml version="1.0" encoding="utf-8"?> 2 <Message> 3 <Header> 4 <Version>2000000</Version> 5 <MessageClass>5</MessageClass> 6 <MessageType>7</MessageType> 7 <SenderId

Ex 2_25 n位十进制整数转换为二进制形式..._第四次作业

(a)   当n=1时,(10)d=(1010)b 当n=2时,(100)d=(10)d x (10)d=(1010)b x (1010)b 当n=4时,(10000)d=(100)d x (100)d=(1010)b x (1010)b x (1010)b x (1010)b - 因此z=pwr2bin(n/2) T(n)=T(n/2)+(cn/2)log23=>T(n)=O(nlog23) (b) 若十进制整数x的位数等于1,则返回binary[x] 假设位数为n(n>1且n为2的幂),则

C++复数运算符重载(+与&lt;&lt;)

Description 定义一个复数类Complex,重载运算符"+",使之能用于复数的加法运算与输出操作.(1)参加运算的两个运算量可以都是类对象,也可以其中有一个是实数,顺序任意.例如,c1+c2,d+c1,c1+d均合法(设d为实数,c1,c2为复数).(2)输出的算数,在复数两端加上括号,实部和虚部均保留两位小数,如(8.23+2.00i).(7.45-3.40i).(-3.25+4.13i)等.编写程序,分别求两个复数之和.整数和复数之和,并且输出. 请在下面的程序段基础上完