matlab GS算法

输入图片为啥是三维?

第7行维度不匹配。

close all;clear all;clc; %
%% simulate the complex object
INput= imresize((imread('DY.JPG')),[120,90]);
objectAmplitude = uint8(INput);
objectPhase = uint8(imread('DY.JPG'));
objectPhase = 2*pi*imresize(objectPhase,[120,90])./max(max(objectPhase));
object = objectAmplitude.*exp(1i.*objectPhase);%cameraman's amplitude and westcocordorthophoto's phase
%% 得到图像的振幅   和傅里叶平面的振幅
Amplitude_object=abs(object);%测量到的物体的空间域中的振幅
FT_object=fftshift(fft2(object));
FT_object_amp=abs(FT_object);%频率域中的目标振幅   
%% GS 算法
[M , N]=size(object);
Phase=2*pi*rand(M , N);%产生随机相位
for p=1:70;
    fxy=Amplitude_object.*exp(1i*Phase);            %振幅与相位相乘
    Fuv=fftshift(fft2(fxy));
    Fuv_phase=angle(Fuv);                                   %只取傅里叶变换的相位部分。
    Fuv=FT_object_amp.*exp(1i*Fuv_phase);   %代入频率域中的目标强度
    fxy=ifft2(ifftshift(Fuv));
    Phase=angle(fxy);                                               %只取相位部分。
end
%% 输出
figure,imshow(Amplitude_object,[]);title('输入振幅');
figure,imshow(objectPhase,[]);title('输入的相位');
figure,imshow(Phase,[]);title('retrival Phase 复原的相位');

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
GS算法(Gauss-Seidel Algorithm)是一种迭代法,用于求解线性方程组,其特点是每次迭代只需计算一个未知数的值,而不需要使用矩阵的逆。该算法通常用于解决大型稀疏线性方程组,因为它只需要存储一个向量,而不需要存储整个矩阵。 GS算法的基本思想是,将线性方程组的每个方程表示为未知数的函数,然后逐个求解未知数的值。具体来说,对于方程组Ax=b,GS算法的迭代公式为: x_i^{(k+1)} = (b_i - \sum_{j=1}^{i-1} a_{ij}x_j^{(k+1)} - \sum_{j=i+1}^{n} a_{ij}x_j^{(k)})/a_{ii} 其中,i表示当前要求解的未知数的下标,k表示当前迭代次数。在每次迭代中,我们使用上一次迭代中求解的未知数的值,来计算当前未知数的值。因此,GS算法需要从一个初始向量开始迭代,直到收敛。 下面是一个简单的MATLAB示例,用于演示如何实现GS算法来解决线性方程组: function [x, k] = gauss_seidel(A, b, x0, tol, max_iter) % A: 系数矩阵 % b: 常数向量 % x0: 初始向量 % tol: 迭代收敛的容差 % max_iter: 最大迭代次数 n = length(b); x = x0; k = 0; while k < max_iter k = k + 1; for i = 1:n x(i) = (b(i) - A(i,1:i-1)*x(1:i-1) - A(i,i+1:n)*x0(i+1:n))/A(i,i); end if norm(x - x0) < tol return end x0 = x; end end 在这个示例中,我们首先定义了一个函数,该函数接受系数矩阵A、常数向量b、初始向量x0、迭代收敛的容差tol和最大迭代次数max_iter作为输入,并返回解向量x和迭代次数k。 在函数中,我们首先初始化解向量x为初始向量x0,然后进行迭代。在每次迭代中,我们使用for循环遍历未知数的下标i,并根据GS算法的迭代公式计算当前未知数的值。最后,我们使用norm函数计算x和x0之间的差异,并检查是否达到了收敛条件。如果达到了收敛条件,则返回解向量x和迭代次数k。 下面是一个示例,演示如何使用该函数来解决线性方程组Ax=b: A = [4 -1 0 0; -1 4 -1 0; 0 -1 4 -1; 0 0 -1 3]; b = [15; 10; 10; 10]; x0 = [0; 0; 0; 0]; tol = 1e-6; max_iter = 1000; [x, k] = gauss_seidel(A, b, x0, tol, max_iter); 在这个示例中,我们定义了系数矩阵A、常数向量b和初始向量x0,然后调用gauss_seidel函数来解决线性方程组Ax=b。我们使用tol = 1e-6和max_iter = 1000来控制迭代收敛的容差和最大迭代次数。最后,我们打印出解向量x和迭代次数k的值。 需要注意的是,GS算法只有在系数矩阵A是对称正定矩阵时才能保证收敛。否则,算法可能会发散。因此,在实际应用中,我们需要先检查系数矩阵A是否满足这个条件,然后再使用GS算法来求解线性方程组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值