C语言中怎么实现对一个复数取实部的操作 请各位大虾帮帮忙

cobra19860808 2010-12-28 10:26:14
将matlab中real函数用c语言实现
...全文
1668 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cobra19860808 2011-01-04
  • 打赏
  • 举报
回复
老感动了 万分感谢楼上的各位 方法 我一个一个去试验 这里先结贴了 有问题还来问 请大家继续热情帮助
lten1 2011-01-01
  • 打赏
  • 举报
回复
////////////////////////////////////////////////////////////////////////////////
// COMPLEX.H(头文件)
////////////////////////////////////////////////////////////////////////////////

#include
using namespace std;

#ifndef _COMPLEX_H_
#define _COMPLEX_H_

struct COMPLEX { // 复数
double rpart, ipart; // 实部, 虚部
};

void Input(COMPLEX &x); // 输入
void Output(const COMPLEX &x); // 输出
void Set(COMPLEX &x, double rpart, double ipart); // 设置
COMPLEX Add(const COMPLEX &x, const COMPLEX &y); // 加法
COMPLEX Sub(const COMPLEX &x, const COMPLEX &y); // 减法
COMPLEX Mul(const COMPLEX &x, const COMPLEX &y); // 乘法
COMPLEX Div(const COMPLEX &x, const COMPLEX &y); // 除法

#endif

////////////////////////////////////////////////////////////////////////////////
// COMPLEX.CPP(程序文件)
////////////////////////////////////////////////////////////////////////////////

#include "complex.h"

// 输入
void Input(COMPLEX &x) {
cout << "实部: "; cin >> x.rpart;
cout << "虚部: "; cin >> x.ipart;
}

// 输出
void Output(const COMPLEX &x) {
cout << '(' << x.rpart << ", " << x.ipart << ')' << endl;
}

// 设置
void Set(COMPLEX &x, double rpart, double ipart) {
x.rpart = rpart; x.ipart = ipart;
}

// 加法
COMPLEX Add(const COMPLEX &x, const COMPLEX &y) {
COMPLEX z;
z.rpart = x.rpart + y.rpart;
z.ipart = x.ipart + y.ipart;
return z;
}

// 减法
COMPLEX Sub(const COMPLEX &x, const COMPLEX &y) {
COMPLEX z;
z.rpart = x.rpart - y.rpart;
z.ipart = x.ipart - y.ipart;
return z;
}

// 乘法
COMPLEX Mul(const COMPLEX &x, const COMPLEX &y) {
COMPLEX z;
z.rpart = x.rpart * y.rpart - x.ipart * y.ipart;
z.ipart = x.rpart * y.ipart + x.ipart * y.rpart;
return z;
}

// 除法
COMPLEX Div(const COMPLEX &x, const COMPLEX &y) {
COMPLEX z;
double d = y.rpart * y.rpart + y.ipart * y.ipart;
if (d) {
z.rpart = (x.rpart * y.rpart + x.ipart * y.ipart) / d;
z.ipart = (x.ipart * y.rpart - x.rpart * y.ipart) / d;
}
else {
z.rpart = z.ipart = 0;
cerr << "除零错误!\a\n";
exit(EXIT_FAILURE); // 强行结束程序
}
return z;
}

////////////////////////////////////////////////////////////////////////////////
// MAIN.CPP(程序文件)
////////////////////////////////////////////////////////////////////////////////

#include "complex.h"

int main() {
COMPLEX a = {0, 0}, b = {0, 0};
cout << "第一个复数 = ?"; Input(a);
cout << "第一个复数 = "; Output(a);
cout << "第二个复数 = ?"; Input(b);
cout << "第二个复数 = "; Output(b);
cout << "加法之和 = "; Output(Add(a, b));
return EXIT_SUCCESS;
}

flysnowhite 2010-12-31
  • 打赏
  • 举报
回复
使用结构体。
struct complex
{
int real,imag;
};
struct complex c;
c.real=1;
c.imag=2;
为了通用,也可以采用模板实现。
jsjygm 2010-12-30
  • 打赏
  • 举报
回复
也期待答案
CandPointer 2010-12-30
  • 打赏
  • 举报
回复
想了一堆,其实绕太远了。

Matlab的 eig 是Built-in function,没有源代码。

但是,开源的 Scilab ,(http://www.scilab.org/products/scilab/download)
开源的octave (http://www.gnu.org/software/octave/about.html)

都有 类似 matlab的eig函数的。 直接抄它们的代码,就行了。
arong1234 2010-12-30
  • 打赏
  • 举报
回复
很怀疑没有基础线代知识能看懂这些[Quote=引用 18 楼 candpointer 的回复:]
引用 16 楼 cobra19860808 的回复:

谢谢楼上的 帅哥 ………… MATLAB的help 我知道 但是没有源码 现在我想知道的是eig 后面带两个参数的 函数 源码 痛苦的是自己不知道这个函数的原理 , 从头开始看线性代数 老大不给那时间啊


不用专门看线性代数。

我记得,大学的时候,我们有门课,叫做 数值计算?计算方法? 还是别的名字。

反正,这课程,就……
[/Quote]
CandPointer 2010-12-30
  • 打赏
  • 举报
回复
Lz,去找本, 《计算方法》的课程的书来,里面,基本上很详细的了。

不然,你直接看 《线性代数》,看通了,也不好做。一下子想不出怎么用电脑去解。
CandPointer 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 cobra19860808 的回复:]

谢谢楼上的 帅哥 ………… MATLAB的help 我知道 但是没有源码 现在我想知道的是eig 后面带两个参数的 函数 源码 痛苦的是自己不知道这个函数的原理 , 从头开始看线性代数 老大不给那时间啊
[/Quote]

不用专门看线性代数。

我记得,大学的时候,我们有门课,叫做 数值计算?计算方法? 还是别的名字。

反正,这课程,就是专门讲 牛顿迭代法,松弛迭代法。拉格朗日。高斯。矩阵分解。特征值。常微分,偏微分,反正一大堆高数里面的问题,用计算机求解的东西。

我以前,都做过的。

不过,都忘了。
下面的链接,是个PPT,讲求矩阵eig value的
http://staff.ustc.edu.cn/~rui/kj/chap7-EigenValues.ppt
cheng_fengming 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 phoenix_ymj 的回复:]
这个用C++简单啊,直接就有complex类
[/Quote]
同意,把复数的实部和虚部分开存。
cobra19860808 2010-12-30
  • 打赏
  • 举报
回复
谢谢楼上的 帅哥 ………… MATLAB的help 我知道 但是没有源码 现在我想知道的是eig 后面带两个参数的 函数 源码 痛苦的是自己不知道这个函数的原理 , 从头开始看线性代数 老大不给那时间啊
CandPointer 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 cobra19860808 的回复:]
将matlab中real函数用c语言实现
[/Quote]

LZ,你到底是想哪个函数?

如果是 eig,那就如 #14

如果是 real,非常简单的函数啊


>> edit real

%REAL Complex real part.
% REAL(X) is the real part of X.
% See I or J to enter complex numbers.
%
% See also ISREAL, IMAG, CONJ, ANGLE, ABS.

% Copyright 1984-2005 The MathWorks, Inc.
% $Revision: 5.12.4.4 $ $Date: 2005/06/21 19:28:07 $
% Built-in function.


********************************

两个函数, eig 和 real 的功能,都给出了,不知道谁有C的源码
CandPointer 2010-12-30
  • 打赏
  • 举报
回复
matlab

>>edit eig

%EIG Eigenvalues and eigenvectors.
% E = EIG(X) is a vector containing the eigenvalues of a square
% matrix X.
%
% [V,D] = EIG(X) produces a diagonal matrix D of eigenvalues and a
% full matrix V whose columns are the corresponding eigenvectors so
% that X*V = V*D.
%
% [V,D] = EIG(X,'nobalance') performs the computation with balancing
% disabled, which sometimes gives more accurate results for certain
% problems with unusual scaling. If X is symmetric, EIG(X,'nobalance')
% is ignored since X is already balanced.
%
% E = EIG(A,B) is a vector containing the generalized eigenvalues
% of square matrices A and B.
%
% [V,D] = EIG(A,B) produces a diagonal matrix D of generalized
% eigenvalues and a full matrix V whose columns are the
% corresponding eigenvectors so that A*V = B*V*D.
%
% EIG(A,B,'chol') is the same as EIG(A,B) for symmetric A and symmetric
% positive definite B. It computes the generalized eigenvalues of A and B
% using the Cholesky factorization of B.
% EIG(A,B,'qz') ignores the symmetry of A and B and uses the QZ algorithm.
% In general, the two algorithms return the same result, however using the
% QZ algorithm may be more stable for certain problems.
% The flag is ignored when A and B are not symmetric.
%
% See also CONDEIG, EIGS, ORDEIG.

% Copyright 1984-2005 The MathWorks, Inc.
% $Revision: 5.13.4.6 $ $Date: 2005/06/21 19:35:51 $
% Built-in function.
cobra19860808 2010-12-30
  • 打赏
  • 举报
回复
额 高深了 赶明儿 我就去买书…… 您说的问题我一个也不明白
arong1234 2010-12-30
  • 打赏
  • 举报
回复
我想每个思路都需要你对矩阵那一套懂才行吧,这不是普通的编程问题,我告诉你可以对具有对角优势的矩阵可以通过旋转的方法把能量集中到对角线求解,对普通矩阵可以用矩阵幂方法求解,你理解了多少?
我估计第一步是理解这些基本概念,第二步是赶快到书店买本“数值分析”的书
[Quote=引用 11 楼 cobra19860808 的回复:]
楼上的真知灼见~~~ 对于特征值 和特征向量的函数网上有【v,d】 =eig(A)的原型, 【v,d】 =eig(A,B)这个没有函数原型,对于这个函数的理解没有数学基础果然看不懂…… 现在我做的是将MATLAB中的【v,d】 =eig(A,B) 这个函数用C还原 头痛啊 !! 给个思路我就万分感谢了 有源码支持 最好 ~~~~
[/Quote]
cobra19860808 2010-12-30
  • 打赏
  • 举报
回复
楼上的真知灼见~~~ 对于特征值 和特征向量的函数网上有【v,d】 =eig(A)的原型, 【v,d】 =eig(A,B)这个没有函数原型,对于这个函数的理解没有数学基础果然看不懂…… 现在我做的是将MATLAB中的【v,d】 =eig(A,B) 这个函数用C还原 头痛啊 !! 给个思路我就万分感谢了 有源码支持 最好 ~~~~
arong1234 2010-12-30
  • 打赏
  • 举报
回复
这种东西:
1。你必须弄明白对应的matlab函数到底是干嘛的!
2。弄清楚之后估计你要看数学了,了解数学概念
3。根据概念实现
一般C/C++不会提供这么复杂的数学计算的库的,第三方也许会,所以如果你搞数学编程这点基础知识是必须学习的,别人帮不了多少的。如果你每有基础,除非帮你写,否则即使解释你也不一定能领会
[Quote=引用 8 楼 cobra19860808 的回复:]
谢谢 楼上各位 ,现在还有个问题是 【v,d】 =eig(A,B)这个MATLAB中的封装函数,没有相应的C函数原型支持 哪位大虾有资料可循 麻烦告知下。万分感谢
[/Quote]
arong1234 2010-12-30
  • 打赏
  • 举报
回复
你这不是取复数的实部,这是取矩阵的特征值吧?!为什么觉得这是复数的实部!!!!
取特征值是个复杂的运算,建议楼主搞本数值计算的书看吧,这些书总会讲这个的
[Quote=引用 8 楼 cobra19860808 的回复:]
谢谢 楼上各位 ,现在还有个问题是 【v,d】 =eig(A,B)这个MATLAB中的封装函数,没有相应的C函数原型支持 哪位大虾有资料可循 麻烦告知下。万分感谢
[/Quote]
cobra19860808 2010-12-30
  • 打赏
  • 举报
回复
谢谢 楼上各位 ,现在还有个问题是 【v,d】 =eig(A,B)这个MATLAB中的封装函数,没有相应的C函数原型支持 哪位大虾有资料可循 麻烦告知下。万分感谢
lengxujun 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bruceteen 的回复:]
引用 5 楼 phoenix_ymj 的回复:

这个用C++简单啊,直接就有complex类

在C++中complex是库支持的,而在C中,_Complex是语言原生支持的,和int,float等同一级别
[/Quote]

对. C99 支持复数类型.
bruceteen 2010-12-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 phoenix_ymj 的回复:]

这个用C++简单啊,直接就有complex类
[/Quote]
在C++中complex是库支持的,而在C中,_Complex是语言原生支持的,和int,float等同一级别
加载更多回复(4)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧