【问题标题】:Warning: Matrix is singular to working precision警告:矩阵对于工作精度来说是奇异的
【发布时间】:2020-09-30 18:40:36
【问题描述】:

我有一个方程式要计算。但是命令窗口显示“警告:矩阵对于工作精度来说是奇异的。”。并且计算的结果是矩阵中的NaN。

lambda = 13.5e-9;
k = 2*pi/lambda;
r0 = 1e-3;
a = 10e-6; b = 10e-6;
beta = 6*pi/180; 
Lx = 300e-6; Ly = 300e-6; dx=1e-6; dy=1e-6;
x = -Lx/2:dx:Lx/2-dx; y = -Ly/2:dy:Ly/2-dy;
[X,Y] = meshgrid(x,y);
p = X/r0; q = Y/r0;
I = (sinc(k*a*p)).^2*(sinc(k*b*cos(beta)*(q*cos(beta)-sin(beta)+sin(beta)*sqrt(1-p.^2+q.^2)))).^2;

使用我的 sinc 函数,

function result = sinc(x)
    if x == 0
        result = 1;
    else
        result = sin(x)/x;
    end
end

我在结果 I 中得到了 NaN。我不知道出了什么问题。

【问题讨论】:

    标签: matlab nan


    【解决方案1】:

    您的 sinc 函数将 matrix x 作为输入。您的 x == 0 不会发现除第一个之外的其他零。此外,即使您的数据中没有零,我相信这种矩阵除法也不是您希望代码执行的操作。

    我相信您想要逐元素除法,而不是矩阵运算:sin(x) ./ x。我会这样做:

    result = sin(x) ./ x;
    result(isnan(result)) = 1; % makes those nans arising from 0/0 to 1.
    

    【讨论】:

    • 警告随着 ' ./ ' 消失。但是,所有值仍然是 NaN。
    • @lighttn:你的 if 语句也不正确,没有向量化。研究“逻辑索引”。
    • @lighttn 这两行应该是 sinc 函数的全部内容,它应该可以正常工作 - nan 的值被 1 替换。剩余的值应该是正确的。
    【解决方案2】:

    如果我使用 for,我现在可以做到。我仍然想知道为什么使用网格网格(我在 for 下面做了 %{..., ...%})不起作用。

    lambda = 13.5e-9;
    k = 2*pi/lambda;
    r0 = 0.15;
    a = 3e-6; b = 4e-6; % square sizes at object plane (x', y')
    I0 = 1; % intensity at center (x=y=0)
    beta = 30*pi/180; % rotation aroud x-axis
    
    Lx = 10e-3; Ly = 10e-3; 
    dx=13.5e-6; dy=13.5e-6;
    x = -Lx/2:dx:Lx/2-dx; y = -Ly/2:dy:Ly/2-dy;
    xx = size(x,2); yy = size(y,2);
    I = zeros(xx,yy);
    for i = 1:xx
        for j = 1:yy
            x = i*dx-Lx/2;
            y = j*dy-Ly/2;
            I(i,j) = I0*(sinc(k*a*(x/r0))).^2*(sinc(k*b*cos(beta)*((y/r0)*cos(beta)-sin(beta)+sin(beta)*sqrt(1-(x/r0).^2+(y/r0).^2)))).^2;
        end
    end
    
    %{
    [X,Y] = meshgrid(x,y);
    p = X/r0; q = Y/r0;
    I(x",y")
    I = I0*(sinc(k*a*p)).^2*(sinc(k*b*cos(beta)*(q*cos(beta)-sin(beta)+sin(beta)*sqrt(1-p.^2+q.^2)))).^2;
    %}
    
    figure(1)
    imagesc(x,y,I)
    axis()
    colorbar()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      相关资源
      最近更新 更多